2012-03-19 14 views
7

定義済みのコンストラクタX(int value)を持つクラスXがあるとします。"X x(42)"と "X x = 42"を使用したオブジェクト構成の違い?

意味的に同等かどうか

X x = 42; 
X x(42); 

は、私たちはそうでない場合、コンパイラは私が間違っているなら、私を修正し、X x(42);

してくださいに表現X x = 42;を削減するX. のコンストラクタに明示キーワードを追加する場合にのみ差が表示されます信じています。

答えて

7

として宣言されていない形態

X x = 42; 

は、コンストラクタは、非明示的およびアクセスコピーコンストラクタが存在することがあることを必要とします。実装は一時的な構造を構築し、それをコピーすることは許されていますが、私が知っている実装はそれを行いません。

+0

明示的な代入演算子をバイパスしますか?私はそれがそのルートを取ると思っていただろう。しかし、私の脳は確かに少しばかげている。 –

+2

いいえ、一時的な構成はできません。あなたは 'X x = X(42)'と混同していますか? – Pubby

+3

@Pubby:そうです、これは理由のために_copy initialization_と呼ばれています。 ; - 実際には、それはいつも逃げられるでしょう。 – ildjarn

5

は、意味的に2つの操作が仕様では、言語ごとに異なりますが、コンパイル後の効果的な結果は、以下の状況で同じです:積分を取ることができXのための単一の引数のコンストラクタがあり

  1. 型の型が非constのl値の参照ではありません
  2. Xの場合、1つの引数コンストラクタがあり、整数型を引数型に変換できます。引数が再び非整数型の値でない場合、定数値の参照
  3. は、#2の場合には、コンストラクタがexplicit
+4

これは1つの長文です。 – avakar

+0

Haha、true ... fixed :-) – Jason

関連する問題