重複の可能性:
コピーの初期化と代入の初期化の間に C++ の違いはありますか?
私は C++ を初めて使用します。この構文を使用して変数を宣言および初期化する人をめったに見ません。
int x(1);
私が試したところ、コンパイラは文句を言わず、出力は int x=1 と同じですが、実際には同じものですか?
皆様、どうもありがとうございました。
重複の可能性:
コピーの初期化と代入の初期化の間に C++ の違いはありますか?
私は C++ を初めて使用します。この構文を使用して変数を宣言および初期化する人をめったに見ません。
int x(1);
私が試したところ、コンパイラは文句を言わず、出力は int x=1 と同じですが、実際には同じものですか?
皆様、どうもありがとうございました。
はい、組み込み型の場合int x = 1;
とint x(1);
同じです。
クラス型のオブジェクトを構築する場合、2 つの異なる初期化構文は微妙に異なります。
Obj x(y);
これは直接的な初期化y
であり、コンパイラーに、またはy
暗黙的に変換できるものを受け取る明確なコンストラクターを検索するように指示し、このコンストラクターを使用して x を初期化します。
Obj x = y;
これはコピーの初期化Obj
であり、変換によって一時を作成するようにコンパイラに指示し、のコピー コンストラクタをy
使用して初期化します。Obj
x
の型が の型と同じ場合、コピーの初期化は直接の初期化と同等です。y
x
copy initalizationの場合、一時的に使用されるのは暗黙的な変換の結果であるため、マークされたコンストラクターexplicit
は考慮されません。構築された型のコピー コンストラクターはアクセス可能である必要がありますが、コピー自体は最適化としてコンパイラーによって削除される場合があります。
POD タイプの場合、両方のステートメントは同一です。
私は C++ の専門家ではありませんが、同じ結果が得られる場合、問題はありますか? 本当に興味があれば、コードをコンパイル (アセンブルではなく) して、違いを確認できます。
編集: 他の場所で言及されているように、それらは組み込み型の場合と実際には同じです。