ホームに戻る
出典 :
関連 :
目次 :
クラス定義時に暗黙的に定義される関数 : 特殊メンバ関数
クラスを定義すると、以下のメンバ関数が暗黙的に定義される。これらは特殊メンバ関数と呼ばれる。
- デフォルトコンストラクタ (引数無しのコンストラクタ)
- コピーコンストラクタ
- ムーブコンストラクタ
- コピー代入演算子
- ムーブ代入演算子
- デストラクタ
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()
{
:
}