2009-10-03 12 views
6

可能性の重複:
Is there a difference in C++ between copy initialization and assignment initialization?C++のint x = 1とint x(1)の違いは何ですか?

私は、私はほとんどの変数を宣言して初期化するために、この構文を使用している人々をC++に新しい見えないのです。

int x(1); 

私が試した、コンパイラ不平を言っておらず、出力はint x = 1と同じですが、実際には同じですか?

皆さん、ありがとうございます。

+2

Dupe:http://stackoverflow.com/questions/1051379/is-there-a-difference-in-c-between-copy-initialization-and-assignment-initializ –

+0

全く同じではありません。この質問は、特にPODの初期化に関するものです。 – Boojum

答えて

13

はい、組み込みタイプの場合int x = 1;int x(1);は同じです。

クラス型のオブジェクトを構築するとき、2つの異なる初期化構文が微妙に異なります。

Obj x(y); 

これは直接初期化であると明確なyを取るコンストラクタ、またはyが暗黙的に変換することができます何かを検索するようにコンパイラに指示し、Xを初期化するために、このコンストラクタを使用しています。

Obj x = y; 

これはコピーの初期化あるとyを変換することによって、一時的なObjを作成するようにコンパイラに指示し、xをinitalizeするObjのコピーコンストラクタを使用しています。 yのタイプはxのタイプと同じである場合 initalization

コピー直接初期と等価です。

コピー初期化の場合、一時的に使用されるのは暗黙の変換の結果であるため、explicitとマークされたコンストラクタは考慮されません。構築された型のコピーコンストラクタはアクセス可能でなければならないが、コピー自体はオプティマイゼーションとしてコンパイラによって削除することができる。

+0

それはObj xを指摘する価値があります。 x = y;さらに別のバリエーションが得られます。この場合、xはデフォルトで構築されます。次に、次のステートメントで代入演算子が呼び出されます。注目に値する –

+3

もう一つは、(クラスのコンストラクタの呼び出しに類似した構文を使用して)この方法を初期化するためにintなどプレーン古いデータ型を許可することにあるテンプレートが透過的にPODとクラス型の両方で動作することができます。 – Boojum

+1

@Boojum:その機能をC++言語に追加することは、初期化リスト内の任意のタイプのオブジェクトを初期化する単一の方法を提供することを意味していました。これは、テンプレート内の初期化よりも重要であり(共通)、これは 'Type object = other_object'構文で解決できます。 –

0

私はC++の専門家ではありませんが、同じ結果が得られる場合は重要ですか?あなたが本当に興味があったら、あなたのコードをコンパイルして(組み立てることなく)、違いが何であるかを見てみてください。

編集:他のところで述べたように、それらは組み込みタイプでは本当に同じです。

+4

もちろん、それは重要です。同じ結果が表示される場合がありますが、異なる結果をもたらすすべてのエッジケースについて、どのような副作用があるかわからないことを意味する可能性があります。これは初心者/中級プログラマからの非常に合理的な質問です。 – mob

1

PODタイプの場合、両方のステートメントは同一です。

関連する問題