C++ レコードの概要とインタビューのよくある質問

ポインタと関数

関数値の転送は変数コピーをコピーしてメモリ空間を増加させますが、関数内で変数値を変更してもメイン関数(関数外)の変数値には影響しません。
関数ポインタを渡しても変数のコピーはコピーされず、ポインタ変数は固定の最初のバイトを占有するため、占有されるメモリ領域は増加しません。関数の内部パラメータ値を変更すると、関数の外部でも変更されます。関数内のデータを変更したくない場合、または誤用を防止したくない場合は、const ポインターを渡すことができます。
func(int a, int b) は値によって渡され、仮パラメータは実際のパラメータを変更しません
func(int *a, int *b) はアドレスによって渡され、仮パラメータは実際のパラメータを変更します
func(int& a, int& b) は、仮引数を参照渡しします。実引数を変更します。変更したくない場合は、仮引数の前に const を追加します。

メモリパーティションモデル

プログラムの実行前:
コード領域: 関数本体のバイナリ コードが格納され、オペレーティング システムによって管理されます。共有 + 読み取り専用機能。
グローバル領域:グローバル変数、スタティック変数、定数を格納する
領域 プログラム実行後:
スタック領域:コンパイラにより自動的に確保、解放され、関数のパラメータ値、ローカル変数などを格納 ローカル変数のアドレスは返せませんので、初回予約時に2回目で文字化けが解除されます。
ヒープ領域: プログラマによって割り当ておよび解放されます。プログラマが解放しない場合、プログラムの終了時にオペレーティング システムによって再利用されます。新しいキーワードは、データ メモリをヒープ領域に開くために使用できます。手動でオープン、手動で解放します。キーワードは、配列に [] を加えた場合、つまり、別の領域に格納されているデータを削除する [] の場合は削除です。さまざまなライフサイクルに対応し、
より柔軟なプログラミングを備えています。

アクセス許可

public メンバーはクラス内でアクセス可能、
クラス外からはアクセス可能、protected はクラス内でアクセス可能、クラス外からはアクセス不可、サブクラスは
private にアクセス可能、クラス内でアクセス可能、クラス外からはアクセス不可、サブクラスはメンバーの属性/変数にアクセスできません
。プライベートなので、読み取りおよび書き込み権限を自分で制御でき、データの正当性を確認できます。読み取りまたは書き込み操作は、パブリック メンバー関数を通じて設定できます。

構造体とクラス クラスを作成する

構造体のデフォルトのパブリック権限
クラスのデフォルトのプライベート権限

コンストラクタ

パラメータ: パラメータ付きの構築、パラメータなしの構築 (デフォルトの構築)
種類: 通常の構築、コピー構築 渡された属性を自分にコピーする 使用方法: (クラス名 (const クラス名 & 属性))、コピーは使用できないことに注意してください コンストラクタ、匿名オブジェクトに初期化されると、再定義されます。
() を追加せずにデフォルトのコンストラクターを呼び出します。() を追加すると、コンパイラーはそれを関数宣言とみなします。
呼び出しメソッド: 1. 匿名オブジェクトでもあるブラケット メソッド。匿名オブジェクトは、現在の行の実行直後にリサイクルされます (デストラクターの呼び出し) 2. 明示的なメソッド。ブラケット メソッドを使用して左側のパラメーター メソッドに割り当てます。 3. パラメータ構造体を暗黙的に呼び出し、左の参照に直接 = 代入します。

静的メンバー

静的メンバー変数と静的メンバー関数を含む
静的メンバー変数:
1. すべてのオブジェクトが 1 つのデータを共有する
2. コンパイル段階でメモリを割り当てる
3. クラス内宣言とクラス外初期化
2 つのアクセス方法があります。オブジェクトとクラス名によるアクセス
静的メンバー関数:
1. すべてのオブジェクトが関数を共有します
2. 静的メンバー変数のみにアクセスできます

このポインタ

this ポインタは、呼び出されたメンバー関数が属するオブジェクトを指します。
すべての非静的メンバー関数内のポインターが暗黙的に含まれます。
定義する必要はなく、直接使用するだけです。
目的:
仮パラメータとメンバ変数が同じ名前である場合、this ポインタを使用してそれらを区別できます。Python の self と同様に、
クラスの非静的メンバー関数でオブジェクト自体を返します。return *this を使用します。

const 変更されたメンバー関数

これは定数関数と呼ばれ、定数関数ではメンバー属性を変更できません。(このポインタの本質はポインタ定数であり、ポインタのポイントは変更できません。)変更したい
場合は、メンバ属性宣言にキーワード mutable を追加し、
オブジェクト宣言の前に const を追加すると、それは一定のオブジェクトです。
定数オブジェクトは定数関数のみを呼び出すことができます。

友人 友人

その目的は、関数またはクラスが別のクラスのプライベート メンバーにアクセスできるようにすることです。
1. グローバルが友達として機能
2. クラスが友達として
機能 3. メンバーが友達として機能

演算子のオーバーロードと関数のオーバーロード

C++ では、関数と演算子の複数の定義を同じスコープ内で指定できます。これは、それぞれ関数のオーバーロードと演算子のオーバーロードと呼ばれます。
組み込みデータ型の式演算子は不変です

継承する

文法: クラス サブクラス (派生クラス): 継承メソッド 親クラス (基本クラス)
利点: コードの重複を減らす
ここに画像の説明を挿入

ここに画像の説明を挿入

ファイルの読み取り ifstream/fstream

最初の 3 つは行単位で読み取られ、4 番目は 1 文字を読み取る最も効率の悪いもの、最初の 2 つは文字列を表す C 言語の文字配列、3 番目は文字列を表す C++string です。
ここに画像の説明を挿入

ベクターでのサイズ変更と予約の違い

1. 容量はコンテナの初期化時に割り当てられ、コンテナが保持できる要素の最大数を指します。この時点では、コンテナ内にオブジェクトは作成されておらず、添え字を介してアクセスすることはできません。
2. サイズはコンテナ内の実際の要素数を指し、添え字によってアクセスできます。
サイズ変更は、メモリ領域の割り当てとオブジェクトの作成の両方を行います。つまり、容量サイズを変更すると、サイズ サイズも変更されます。
reserve は容量のみを変更し、サイズは変更しません。

スマートポインター

shared_ptr、unique_ptr、weak_ptrshared_ptr
: 参照カウントがヒープに保存されるため、複数のポインターが同じオブジェクトを指すことが
できます unique_ptr: オブジェクトを排他的に指し、ある unique_ptr が指すオブジェクトを別の unique_ptr に割り当てることはできません。参照カウントが不要で、shared_ptr よりもパフォーマンスが向上します
wear_ptr: これは、shared_ptr によって管理されるオブジェクトを指す、ポイントされたオブジェクトの有効期間を制御しないスマート ポインターです。

左辺値と右辺値

アドレスを取得でき、名前があり、一時的ではないものは左辺値です。
名前なしでアドレスを一時的に取得することはできません。通常、ライフサイクルは式内の右辺値です。

引用

オブジェクトのエイリアス、つまりオブジェクト自体が仮パラメータを変更すると、実際のパラメータ自体も変更されます。
別のオブジェクトへの参照ポイントを作成することはできません
。可能な限り参照を使用し、ポインタは最後の手段として使用してください。

マクロ定義とconstの違い

(1) コンパイラの処理が異なる

  • 定義マクロは、前処理フェーズ中に展開されます。
  • const 定数はコンパイル時と実行時に使用されます。

(2) 型とセキュリティチェックの違い
const 定数はデータ型を持ちますが、マクロ定数はデータ型を持ちません。コンパイラは前者に対して型安全性チェックを実行できます。後者の場合、型安全性チェックは行われずに文字置換のみが実行されるため、文字置換時に予期しないエラー (限界効果) が発生する可能性があります。

  • 定義マクロには型がなく、型チェックも行わず、展開するだけです。
  • const 定数には特定の型があり、コンパイル時に型チェックが実行されます。

(3) 保管方法の違い

  • 定義マクロは展開されるだけで、何度使用してもメモリは割り当てられません。

  • const 定数はメモリ内 (ヒープ上またはスタック上) に割り当てられます。

(4) const はスペースを節約し、不必要なメモリ割り当てを回避できます。
(5) コンパイラは通常、通常の const 定数に記憶領域を割り当てず、シンボル テーブルに保存するため、コンパイル時に定数となり、メモリに格納したり読み込んだりする操作が不要となり、非常に効率が高くなります。

文字列と文字の変換

1. 文字列を char* に変換します。

str を char* 型に変換するには、次の 3 つの主なメソッド、つまり data()、c_str()、copy()、
1.data() メソッドがあります。

string str = "hello";
const char* p = str.data();//加const  或者用char * p=(char*)str.data();的形式

2.c_str() メソッド。次のようなものです。

1 string str=“world”;
2 const char *p = str.c_str();//同上,要加const或者等号右边用char*

3.copy() メソッド、たとえば:

1 string str="hmmm";
2 char p[50];
3 str.copy(p, 5, 0);//这里5代表复制几个字符,0代表复制的位置,
4 *(p+5)=‘\0;//注意手动加结束符!!!

2. char * を文字列に変換します。

直接割り当てることができます。

1 string s;
2 char *p = "hello";//直接赋值
3 s = p;

プッシュバックとエンプレースバック

emplace_back() と Push_back() の違いは、基礎となる実装メカニズムにあります。
Push_back() がコンテナの最後に要素を追加する場合、最初に
要素を作成し、次にその要素をコンテナにコピーまたは移動します (コピーの場合は、後で以前に作成した要素を破棄します)。() in 実装すると、要素はコンテナの最後に直接作成されるため、要素をコピーまたは移動する必要がなくなります。

ポインタ定数と定数ポインタ

const pointer (ポインタ): (定数への) ポインタ。

int a = 10;
int b = 20;
const int* p1 = NULL;
p1 = &a;
// 指针p1所指向的变量是一个常量,即指针p1在解引用时,值不能改变
p1 = 20;在这里插入代码片

ポインタ定数 (定数): (ポインタ自体は) 定数です。

// 指针常量
int const p2 = &a;
// 指针只能指向a的地址,a的值可以改变,指针p2已经指向了a的地址,所以不能指向b;
p2 = &b;

これは次のように理解することもできます。次のように const キーワードの位置を直接調べます:
定数ポインター:

const int p1 = nullptr;或者 int const * p1 = nullptr;

ポインタ定数:

int* const p2 = nullptr;

おすすめ

転載: blog.csdn.net/qq_39506862/article/details/129699029