コピー・コンストラクター により、
初期化をすることで、既存オブジェクトから新規オブジェクトを作成できます。
クラス 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 のコンストラクターを暗黙的に定義します。
暗黙的に定義されたコピー・コンストラクターは、 コンストラクターがオブジェクトの基底およびメンバーを初期化する順序と同じ順序で、 オブジェクトの基底およびメンバーをコピーします。
関連参照