ホームに戻る
出典 :
関数のdefault/delete宣言 - cpprefjp C++日本語リファレンス
関連 :
C++11 コピーコンストラクタ ムーブと右辺値参照 演算子オーバーロード インライン関数 (Inline Function) 仮想関数 (Virtual Function)
目次 :

クラス定義時に暗黙的に定義される関数 : 特殊メンバ関数

クラスを定義すると、以下のメンバ関数が暗黙的に定義される。これらは特殊メンバ関数と呼ばれる。 C++11にて、特殊メンバ関数の暗黙定義を制御するために default / delete 構文が追加された。

default 宣言

= defaultは、暗黙定義のデフォルトの挙動を使用することを明示する。
関数の挙動を変えずにインライン化、または仮想化する際に有用となる。
class X { public: // デストラクタを仮想化 // ただし挙動はデフォルトのままとする virtual ~X() = default; // コピーコンストラクタをインライン化 // ただし挙動はデフォルトのままとする inline X(const X&) = default; };

delete 宣言

= deleteは、暗黙定義を禁止することを明示する。これにより、クラスのコピーやムーブを制限することができる。
class X { public: // コピーコンストラクタ、コピー代入演算子の定義を削除 // ⇒ コピー禁止 X(const X&) = delete; X& operator =(const X&) = delete; // 特殊メンバ関数の一部を明示的に定義、もしくは delete 宣言した場合、 // それ以外の特殊メンバ関数は default 宣言しなければ暗黙定義されない // ⇒ 明示的に定義するか、default / delete 宣言する必要がある X() = default; //< デフォルトコンストラクタ X(X&&) = default; //< ムーブコンストラクタ X& operator =(X&&) = default; //< ムーブ代入演算子 }; int main() { X x1; // X x2 = x1; //< コピーコンストラクタが削除されているためコピー不可 ⇒ コンパイルエラー X x3 = X(); //< ムーブコンストラクタ呼び出し ⇒ OK X x4; // x4 = x1; //< コピー代入演算子が削除されているためコピー不可 ⇒ コンパイルエラー X x5; x5 = X(); //< ムーブ代入 ⇒ OK }

特殊メンバ関数以外への delete

= deleteは特殊メンバ関数以外に対しても使用でき、特定のオーバーロードを明示的に禁止することができる。
void f() = delete; //< 引数無しの f() 定義を禁止 // delete 宣言されているため、関数定義できない ⇒ コンパイルエラー void f() { : }