45項 C++がどんな関数を黙って書き、呼び出しているのか、知っておこう
C++がどんな関数を黙って書き、呼び出しているのか、知っておこう
クラスを書くときに、コピーコンストラクタ、代入演算子、コンストラクタ、デストラクタ、アドレス演算子を自分で宣言しないと、コンパイラが自動で作成します。
つまり、
class Empty{};
と書いたとき、下の定義と同じになります。
class Empty { Empty(){} //デフォルトコンストラクタ 特に何もしない ~Empty(){} //デフォルトデストラクタ 特に何もしない Empty(const Empty &rhs){...} //コピーコンストラクタ 全ての非staticメンバをコピー Empty &operator=(const Empty &rhs){...} //代入演算子 全ての非staticメンバをコピー Empty *operator&(); //2つのアドレス演算子 const Empty *operator&() const; };
このコピーコンストラクタと代入演算子は全ての非staticメンバをコピーするため、動的に確保されるメンバを含んだ場合に問題が起こります。
この問題については11項に記述されています。
コピーコンストラクタや代入演算子の内部で、基底クラスのコピーコンストラクタや代入演算子が呼び出されることもないので、注意します。
これについては、16項に記述されています。