1

C++ の構文/構造に関する質問があります。次の Foo(Foo x){} を呼び出すことができるシナリオは何ですか? コピーコンストラクターを呼び出すため、初期化のように呼び出されないことを理解しています

Foo a;
Foo x = a;
or 
Foo x(a);

渡された引数がクラスと同じ型であるため、型の変換用ではありません

Foo(Foo x){} が呼び出されるシナリオが思い浮かびません。そうしないと、常にデッド コードになります。

class Foo { 
  public :
    Foo(Foo x){  // notice it is not not a Copy constructor!!, i intented it to make like ordinary ctor taking same class object
    }
    Foo(int x) : m_data(x){}
private :
  int m_data;
};
4

3 に答える 3

11

実際にこのコードをコンパイルしようとしましたか?

Error   1   error C2652: 'Foo' : illegal copy constructor: first parameter must not be a 'Foo'  main.cpp    5   1   NativeConsoleSketchbook

C++11 標準、12.8.6:

クラス X のコンストラクターの宣言は、その最初のパラメーターが X 型 (オプションで cv 修飾されている) であり、他のパラメーターがないか、他のすべてのパラメーターに既定の引数がある場合、形式が正しくありません。

于 2013-07-22T05:24:51.360 に答える
3

このウィキペディアの記事からの引用(強調は私のもの):

以下は無効なコピー コンストラクタです(理由 - copy_from_me が参照として渡されません)。

X(X copy_from_me);
X(const X copy_from_me);

これらのコンストラクターへの呼び出しにはコピーも必要であり、その結果、無限に再帰的な呼び出しが発生するためです。

于 2013-07-22T05:27:26.750 に答える
2

Foo(Foo x)コードはそれをコピー コンストラクターとして解釈しようとして失敗するため (コンパイル エラー)、呼び出されることはありません。

非型メソッド (コンストラクタ、デストラクタなど) は、各ケースの構文に従う必要があります。

于 2013-07-22T05:28:26.707 に答える