コピー・コンストラクター

C++コピー・コンストラクター により、 初期化をすることで、既存オブジェクトから新規オブジェクトを作成できます。 クラス A のコピー・コンストラクターは、第 1 パラメーターが、型 A&const A&volatile A&、または const volatile A& である非テンプレート・コンストラクターであり、そのパラメーターの残りは (他にあれば)、デフォルト値を持っています。

クラス A に対してコピー・コンストラクターを宣言しない場合、 コンパイラーは、コピー・コンストラクターを暗黙的に宣言し、 それはインライン・パブリック・メンバーとなります。

次の例は、暗黙的に定義されたコピー・コンストラクターと、暗黙的なユーザー定義のコピー・コンストラクターを示しています。

#include <iostream>
using namespace std;
 
struct A {
  int i;
  A() : i(10) { }
};
 
struct B {
  int j;
  B() : j(20) {
    cout << "Constructor B(), j = " << j << endl;
  }
 
  B(B& arg) : j(arg.j) {
    cout << "Copy constructor B(B&), j = " << j << endl;
  }
 
  B(const B&, int val = 30) : j(val) {
    cout << "Copy constructor B(const B&, int), j = " << j << endl;
  }
};
 
struct C {
  C() { }
  C(C&) { }
};
 
int main() {
  A a;
  A a1(a);
  B b;
  const B b_const;
  B b1(b);
  B b2(b_const);
  const C c_const;
//  C c1(c_const);
}

次に、上記の例の出力を示します。

Constructor B(), j = 20
Constructor B(), j = 20
Copy constructor B(B&), j = 20
Copy constructor B(const B&, int), j = 30

ステートメント A a1(a) は、暗黙的定義のコピー・コンストラクターを使用して、a から新規オブジェクトを作成します。 ステートメント B b1(b) は、ユーザー定義のコピー・コンストラクター B::B(B&) を使用して、b から新規オブジェクトを作成します。 ステートメント B b2(b_const) は、コピー・コンストラクター B::B(const B&, int) を使用して、新規オブジェクトを作成します。 コンパイラーは、第 1 パラメーターとして型 const C& のオブジェクトを取得するコピー・コンストラクターが定義されていないので、 ステートメント C c1(c_const) を許可しません。

次のことが true の場合、暗黙的に宣言されたクラス A のコピー・コンストラクターは、A::A(const A&) の書式を持ちます。

クラス A に対して上記のことが true でない場合、 コンパイラーは、A::A(A&) の書式のコピー・コンストラクターを暗黙的に宣言します。

コンパイラーは、コンパイラーがクラス A のコピー・コンストラクターを暗黙的に定義する必要があり、 次のなかで 1 つまたは複数が true になるプログラムは、許可しません。

A のオブジェクト、またはクラス A から派生したオブジェクトを初期化する場合、 コンパイラーは、暗黙的に宣言されたクラス A のコンストラクターを暗黙的に定義します。

暗黙的に定義されたコピー・コンストラクターは、 コンストラクターがオブジェクトの基底およびメンバーを初期化する順序と同じ順序で、 オブジェクトの基底およびメンバーをコピーします。

関連参照

IBM Copyright 2003