特殊メンバ関数とは
コンパイラが暗黙的に生成することがある関数。以下の6つが存在する。
- デフォルト・コンストラクタ(引数を一つも取らないコンストラクタ)
- デストラクタ
- コピーコンストラクタ
- コピー代入演算子
- ムーブコンストラクタ
- ムーブ代入演算子
特殊メンバ関数が暗黙的に生成される条件
デフォルト・コンストラクタ
ユーザ宣言されたコンストラクタが一つもないときに暗黙的に生成される。
デストラクタ
ユーザ宣言されたデストラクタが無い時に暗黙的に生成される。
基底クラスが仮想デストラクタを持っている場合、暗黙的に生成されるデストラクタも仮想デストラクタになる。
コピーコンストラクタ/コピー代入演算子
ユーザ宣言されたコピーコンストラクタ/コピー代入演算子が無い時暗黙的に生成される。
**ただし、ムーブコンストラクタ/ムーブ代入演算子がユーザ宣言されている場合は「=delete」として宣言される。**これは、ユーザ宣言されたムーブコンストラクタ/ムーブ代入演算子があるということは何らかのリソース管理が必要なはずなので、コピーコンストラクタ/コピー代入演算子もユーザ宣言する必要があるはずという考えに基づいている。
ムーブコンストラクタ/ムーブ代入演算子
ユーザ宣言されたムーブコンストラクタ/ムーブ代入演算子が無い時暗黙的に生成される。
ただし、ユーザ宣言されたデストラクタ・コピーコンストラクタ・コピー代入演算子・ムーブコンストラクタ・ムーブ代入演算子のいずかが存在する場合は生成されない。
これは、これらの特殊メンバ関数が宣言されている場合はなんらかのリソース管理が必要という事であり、ムーブコンストラクタ/ムーブ代入演算子もユーザ宣言する必要があるはずという考えに基づいている。
ユーザ宣言された特殊メンバ関数がある時に暗黙的に生成される特殊メンバ関数の対応表
ユーザ宣言された 特殊メンバ関数 |
デフォルトコンストラクタ | デストラクタ | コピーコンストラクタ | コピー代入演算子 | ムーブコンストラクタ | ムーブ代入演算子 |
---|---|---|---|---|---|---|
コンストラクタ | ✕ | ○ | ○ | ○ | ○ | ○ |
デストラクタ | ○ | - | ○1 | ○1 | ✕ | ✕ |
コピーコンストラクタ | ○ | ○2 | - | ○1 | ✕ | ✕ |
コピー代入演算子 | ○ | ○2 | ○1 | - | ✕ | ✕ |
ムーブコンストラクタ | ○ | ○2 | delete | delete | - | ✕ |
ムーブ代入演算子 | ○ | ○2 | delete | delete | ✕ | - |
○…暗黙に「=default」と宣言される
✕…暗黙に宣言されない
delete…暗黙に「=delete」と宣言される
-
ユーザ宣言のデストラクタ・コピーコンストラクタ・コピー代入演算子があるという事はなんらかのリソース管理をしているはずであり、おそらくユーザ宣言のコピーコンストラクタ・コピー代入演算子が必要なのでムーブコンストラクタ・ムーブ代入演算子と同様に delete としたいがC++03以前との互換性のため暗黙に宣言されるようになっている。C++11の言語規格では非推奨(deprecated)とされている。 ↩ ↩2 ↩3 ↩4
-
ユーザ宣言のコピーコンストラクタ・コピー代入演算子・ムーブコンストラクタ・ムーブ代入演算子があるという事はなんらかのリソース管理をしているはずであり、おそらくユーザ宣言のデストラクタが必要と思われる。 ↩ ↩2 ↩3 ↩4