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項に記述されています。