C++コンパイラがデフォルトコンストラクタを合成する条件(デフォルトコピーコンストラクタを合成する場合と同じ)

676 ワード

ユーザーがクラスにコンストラクション関数を定義していない場合、コンパイラは各クラスのデフォルトのコンストラクション関数ではなく、コンパイラが必要とする場合にのみデフォルトのコンストラクション関数を合成します.コンパイラ合成のデフォルトのコンストラクタは、プログラマのニーズを満たすのではなく、コンパイラのコンパイルのニーズを満たすだけです(たとえば、メンバー変数の初期化作業では、コンストラクタを定義するためにプログラマが必要です).
1、オブジェクトにデフォルトのコンストラクタを含むオブジェクト
class A{
public:
	A();
}
class B{
public:
	A a;
}
組合せBでは、コンパイラがデフォルトのコンストラクタを合成して、Aのデフォルトのコンストラクタを呼び出して、B自身のメンバー変数を定義(プログラマの初期化を支援しない)する必要があります.組み込み型変数は必要ありません.
2、親にデフォルトのコンストラクタがある
class A{
public:
	A();
}
class B:public A
{
...
}
継承関係では、コンパイラはB合成のデフォルトのコンストラクタクラスにAのデフォルトコンストラクタを呼び出す必要があります.
3、虚関数を持つクラス
虚関数を持つクラスで、コンパイラは必要に応じて、虚関数ポインタを格納する虚表を合成します.
4、虚継承のクラス