C ++では、これを書くと:
class A {
public:
A() { ... }
};
コードが何を使用するかに応じて、コンパイラは実際にこれを生成します。
class A {
public:
A() { ... }
~A() { ... }
A(const A& other) {...}
A& operator=(const A& other) { ... }
};
これで、さまざまなコンストラクターのさまざまなセマンティクスを確認できます。
A a1; // default constructor
A a2(a1); // copy constructor
a2 = a1; // copy assignment operator
コピーコンストラクターは、基本的にすべての非静的データをコピーします。これらは、結果のコードが合法で正気である場合にのみ生成されます。コンパイラが、コピー方法がわからないクラス内の型を(通常の代入規則に従って)検出した場合、コピーコンストラクタは生成されません。つまり、T型がコンストラクターをサポートしていない場合、またはクラスのパブリックフィールドの1つがconstまたは参照型である場合、たとえば、ジェネレーターはそれらを作成せず、コードはビルドされません。テンプレートはビルド時に展開されるため、結果のコードがビルド可能でない場合、失敗します。そして時々それは大声でそして非常に不可解に失敗します。
クラスでコンストラクタ(またはデストラクタ)を定義すると、ジェネレータはデフォルトのコンストラクタを生成しません。これは、デフォルトで生成されたコンストラクターをオーバーライドできることを意味します。それらをプライベートにする(デフォルトではパブリックにする)、オーバーライドして何もしないようにする(メモリを節約し、副作用を回避するのに役立つ)などができます。