C ++インタビューの知識ポイント-------------(1)
記事のディレクトリ
- 配列名はポインタ定数であり、変更できません
- 右シフト演算正数ハイビットフィルゼロ、負数ハイビットフィル1
ベクターのサイズ変更と予約の違いは何ですか?
内および属性に対応し、二つの方法。vector
size()
capacity()
resize(size_type)
reserve(size_type)
size
:実際のコンテナに格納されている要素の数を示しますcapaciy
:再割り当てが発生する前に保存できる要素の数を示します
resize
ベクトルコンテナでresizeメソッドを呼び出すと、コンテナの最後になります追加または削除コンテナを指定されたサイズに到達させるためのいくつかの要素
reserve
capacity
この値のみを設定するには、ベクターコンテナのreserveメソッドを呼び出します
reserved(size_type)は変更されたcapaciy
値であり、現時点ではこれらのメモリスペースはまだ== "ワイルド"である可能性がありますの。使用する場合[]アクセスする演算子、配列がある可能性があります範囲外==問題。
push_backが必要なデータが大量にある場合は、reserve()関数を使用して事前に容量を設定する必要があります。そうしないと、容量拡張操作が多くなり、効率が低下します。
これはvectorの利点であり、そのcapacity()メカニズムによりメモリ割り当ての数が減ります。これは、resize()もreserve()を実行すると言うのと同じです。
ベクトルの[]インデックスとatの違いは何ですか?
文字列内の文字にアクセスする
== []を使用できますまたは文字列内の文字にアクセスするat()==メソッドの場合、開始インデックスは0ですstring.length()-1
。最大有効インデックスは。です(特に、const文字列型のオブジェクトの場合、最大有効インデックスはstring.length()
、であり、最後の文字は'\0’
です。)
[]とat()の違いは、[]はインデックスが有効かどうかをチェックしないのに対し、at()は無効なインデックスに遭遇するとout_of_range例外をスローすることです。
コンストラクターを仮想関数にすることはできますか?
回答: できません
1)オブジェクトの作成時にオブジェクトのタイプを決定する必要があり、仮想関数が実行時にそのタイプを決定するため。オブジェクトを作成するとき、オブジェクトが正常に作成されていないため、コンパイラは、オブジェクトがクラス自体であるか派生クラスであるかなど、オブジェクトの実際のタイプを知ることができません。
2)仮想関数の呼び出しには仮想関数テーブルポインタ、そしてポインタはオブジェクトのメモリ空間に格納されます;コンストラクタが仮想関数として宣言されている場合、オブジェクトはまだ作成されていないため、メモリ空間はなく、呼び出す仮想関数テーブルアドレスもありません。仮想関数、つまりコンストラクター。
手書きのリスト構造
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
重要な点は、最後にありますセミコロン、構造も使用されますセミコロン
仮想機能メカニズム
仮想関数は、動的ポリモーフィズムを実装するために使用されます。
仮想関数の宣言は、関数の前にキーワードを追加することvirtual
です。
ポリモーフィズムの実現はに依存しています仮想関数テーブルと仮想テーブルポインタ。
クラスに仮想関数がある限り、クラスには仮想テーブルがあります。仮想テーブルの決定はコンパイル段階で決定されます。クラスのすべてのオブジェクトは仮想テーブルを共有し、仮想関数のすべての宣言は仮想テーブルを共有します。オーバーヘッドを増やします。
仮想関数のアドレスは仮想テーブルに配置され、オブジェクト構造の10番目に仮想テーブルがあるオブジェクトには1つあります。仮想ポインタ、このポインタは仮想テーブルを指します。派生クラスが基本クラスを継承する場合、および基本クラスの仮想関数メソッドをオーバーライドします次に、派生クラスの仮想テーブルは、仮想関数のアドレスをそれ自体の仮想関数のアドレスに更新します。仮想テーブルポインタは基本クラスに属しているため、仮想関数を呼び出すことができる場合は、最初に仮想テーブルポインタを介して対応する仮想テーブルを見つけ、次に関数を呼び出して達成します。動的バインディング
constの役割を理解していますか
C ++const
ではセマンティック制約を指定でき、コンパイラーはこの制約を適用して、プログラマーが特定の値が変更されないままであることをコンパイラーに通知できるようにします。プログラミングで特定の値が変更されない場合const
は、コンパイラの助けを借りられるように、明示的に使用する必要があります。
const
変更された定数は、変更できないことを意味します。たとえば、const int a = 5;const
変更されたポインタ変数
A: const 修饰指针指向的内容,则内容为不可变量。 const int * p = 5;
B: const 修饰指针,则指针为不可变量。 int * const p = &a
C: const 修饰指针和指针指向的内容,则指针和指针指向的内容都为不可变量。const int * const p = &a
const
関数パラメーターと戻り値を装飾する
修饰按值或者按引用传递的参数时候,表示不能修改内容
修饰指针时候可以防止指针被篡改
const 修饰内置类型的返回值,修饰与不修饰返回值作用一样。
const 修饰自定义类型的作为返回值,此时返回的值不能作为左值使用,既不能被赋值,也不能被修改。
const 修饰返回的指针或者引用,是否返回一个指向 const 的指针,取决于我们想让用户干什么。
-
const
機能を飾るときconst 修饰类成员函数,其目的**是防止成员函数修改被调用对象的值**,如果我们不想修改一个调用对象的值,所有的成员函数都应当声明为 const 成员函数。 注意:**const 关键字不能与 static 关键字同时使用,因为 static 关键字修饰静态成员函数,静态成员函数不含有 this 指针,即不能实例化,const 成员函数必须具体到某一实例。**