C ++で始めて、2つの方法で変数を初期化できることに気付きました
int example_var = 3; // with the assignment operator '='
また
int example_var(3); // enclosing the value with parentheses
どちらか一方を使用する理由はありますか?
C ++で始めて、2つの方法で変数を初期化できることに気付きました
int example_var = 3; // with the assignment operator '='
また
int example_var(3); // enclosing the value with parentheses
どちらか一方を使用する理由はありますか?
最初の形式は 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 番目のオプションをお勧めします。そうは言っても、私は前者を頻繁に使用する傾向があり、文脈とタイプに応じて後者を使用する傾向があります...
両方のような組み込み型の場合int
、同じ意味です。
ただし、カスタム データ型の場合、意味が異なる場合があります。最初の形式はコピー初期化と呼ばれ、2 番目の形式は直接初期化と呼ばれます。
よく読んだ:
それらの出力は同じです...両方の構文がコピーコンストラクターを呼び出します。int およびその他の同様の組み込みデータ型の場合も同じですが、ユーザー定義のデータ型にはいくつかの違いがあります。
それらは同じものにコンパイルされます。ただし、どちらも代入ではなく変数の初期化の形式であり、C では少し重要であり、C++ ではまったく異なる関数 (コンストラクターと代入) が呼び出されるため、重要です。