2

ステートメントを使用してコピーコンストラクターを使用しようとしました:

X y = X();

しかし、コピーコンストラクターは呼び出されていません。g++ 4.1.0 を使用しています。クラスに X(const X&) コンストラクターと X(x&) コンストラクターの両方を設定しました。

これは機能するはずですか、それともコードで非常に基本的な問題を抱えていますか?

クラスの私のコードは

class A
{
 public:
  int i;

  A(int ii)
  {
   i = ii;
  }

  A(const A&)
  {
   i = 5;
  }

  A(A&)
  {
   i = -1;
  }

  A()
  {
   i = 5000;
  }
};

A a = A();または を使用して使用する A a = A(100);と動作しませんが、使用するとA a(b);正常A a = b;に動作します。

私が見逃しているポイントは何ですか?ウィキペディアによると、うまくいくはずですが、私の場合はうまくいきません:(。

すべての回答とコメントを前もって感謝します。

4

4 に答える 4

13

コンパイラは、特定の状況でコピー コンストラクターの呼び出しを省略できます。一時オブジェクトからのオブジェクトの初期化はその 1 つです。この場合、テンポラリを作成して名前付きオブジェクトにコピーするのではなく、テンポラリをその場で作成するだけです。

名前付きオブジェクトを構築し、そのコピーを作成することで、コピー コンストラクターを呼び出すことができます。

X x;
X y = x;
于 2010-08-03T14:58:45.547 に答える
1
X y = X();

デフォルトのコンストラクターを呼び出します。コピー コンストラクターは、コピーするインスタンスへの参照を受け取るコンストラクターです。

コピー コンストラクターのポイントは、同じ型の別のオブジェクトを取得し、そのコピーを作成することです。それ以外はすべてコピー コンストラクターではありません。

于 2010-08-03T14:58:19.030 に答える
0

コピー コンストラクターはステートメントX x(y);orによって呼び出されX x = y;ます。

を呼び出すX x = X();と、デフォルトのコンストラクターが呼び出されます。

を呼び出すとX x = X(100);、1 つのパラメーターを持つコンストラクターが呼び出されます。これらはコピー コンストラクターではありません。

于 2010-08-03T15:00:35.353 に答える
-1

コピー コンストラクターは、オブジェクトを別のオブジェクトで初期化するときに呼び出されます:)。最初の例では、コピー ctor が呼び出されないのは当然のことです。適切なパラメーター リストを持つコンストラクターのみが呼び出されます。

于 2010-08-03T15:35:01.853 に答える