7

C ++で始めて、2つの方法で変数を初期化できることに気付きました

int example_var = 3;  // with the assignment operator '='

また

int example_var(3);  // enclosing the value with parentheses 

どちらか一方を使用する理由はありますか?

4

4 に答える 4

7

最初の形式は C 時代からさかのぼりますが、2 番目の形式は C++ で追加されました。追加の理由は、一部のコンテキスト (特にコンストラクターの初期化子リスト) では最初の形式が許可されていないためです。

この 2 つはすべての型で完全に同等というわけではありません。最初の形式は意味的に、右側から一時変数を作成し、続いてその一時変数から変数をコピーして作成することを意味します。2 番目の形式は、引数からの変数の直接初期化です。

いつ問題になりますか?

最初の形式は、右側から変数の型への暗黙的な変換がない場合、またはコピー コンストラクターが使用できない場合に失敗するため、そのような場合は直接初期化を使用する必要があります。

2 番目の形式は、最初の形式よりも多くのコンテキストで使用できますがmost-vexing-parse になりがちです。つまり、場合によっては、構文が (通常の変数の定義ではなく) 関数の宣言と互換性を持つようになり、言語は、この場合、式が関数宣言として解析されることを決定します。

std::string s = std::string();  // ok declares a variable
std::string s( std::string() ); // declares a function: std::string s( std::string(*)() )

最後に C++11 には、中括弧を使用する 3 番目の形式があります。

std::string s{std::string{}};

この形式には、括弧を使用して直接初期化できるという利点がありますが、同時に誤解が生じにくいという利点もあります。

どちらを使用しますか?

可能であれば、3 番目のオプションをお勧めします。そうは言っても、私は前者を頻繁に使用する傾向があり、文脈とタイプに応じて後者を使用する傾向があります...

于 2012-08-27T14:28:35.757 に答える
6

両方のような組み込み型の場合int、同じ意味です。
ただし、カスタム データ型の場合、意味が異なる場合があります。最初の形式はコピー初期化と呼ばれ、2 番目の形式は直接初期化と呼ばれます。

よく読んだ:

コピー初期化と直接初期化の間に C++ の違いはありますか?

于 2012-08-27T14:22:43.460 に答える
1

それらの出力は同じです...両方の構文がコピーコンストラクターを呼び出します。int およびその他の同様の組み込みデータ型の場合も同じですが、ユーザー定義のデータ型にはいくつかの違いがあります。

于 2012-08-27T14:23:22.837 に答える
0

それらは同じものにコンパイルされます。ただし、どちらも代入ではなく変数の初期化の形式であり、C では少し重要であり、C++ ではまったく異なる関数 (コンストラクターと代入) が呼び出されるため、重要です。

于 2012-08-27T14:22:17.720 に答える