6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

C++11以降で暗黙的に生成される特殊メンバ関数のまとめ

Last updated at Posted at 2021-09-02

特殊メンバ関数とは

コンパイラが暗黙的に生成することがある関数。以下の6つが存在する。

  • デフォルト・コンストラクタ(引数を一つも取らないコンストラクタ)
  • デストラクタ
  • コピーコンストラクタ
  • コピー代入演算子
  • ムーブコンストラクタ
  • ムーブ代入演算子

特殊メンバ関数が暗黙的に生成される条件

デフォルト・コンストラクタ

ユーザ宣言されたコンストラクタが一つもないときに暗黙的に生成される。

デストラクタ

ユーザ宣言されたデストラクタが無い時に暗黙的に生成される。
基底クラスが仮想デストラクタを持っている場合、暗黙的に生成されるデストラクタも仮想デストラクタになる。

コピーコンストラクタ/コピー代入演算子

ユーザ宣言されたコピーコンストラクタ/コピー代入演算子が無い時暗黙的に生成される。
**ただし、ムーブコンストラクタ/ムーブ代入演算子がユーザ宣言されている場合は「=delete」として宣言される。**これは、ユーザ宣言されたムーブコンストラクタ/ムーブ代入演算子があるということは何らかのリソース管理が必要なはずなので、コピーコンストラクタ/コピー代入演算子もユーザ宣言する必要があるはずという考えに基づいている。

ムーブコンストラクタ/ムーブ代入演算子

ユーザ宣言されたムーブコンストラクタ/ムーブ代入演算子が無い時暗黙的に生成される。
ただし、ユーザ宣言されたデストラクタ・コピーコンストラクタ・コピー代入演算子・ムーブコンストラクタ・ムーブ代入演算子のいずかが存在する場合は生成されない。
これは、これらの特殊メンバ関数が宣言されている場合はなんらかのリソース管理が必要という事であり、ムーブコンストラクタ/ムーブ代入演算子もユーザ宣言する必要があるはずという考えに基づいている。

ユーザ宣言された特殊メンバ関数がある時に暗黙的に生成される特殊メンバ関数の対応表

ユーザ宣言された
特殊メンバ関数
デフォルトコンストラクタ デストラクタ コピーコンストラクタ コピー代入演算子 ムーブコンストラクタ ムーブ代入演算子
コンストラクタ
デストラクタ 1 1
コピーコンストラクタ 2 1
コピー代入演算子 2 1
ムーブコンストラクタ 2 delete delete
ムーブ代入演算子 2 delete delete

○…暗黙に「=default」と宣言される
✕…暗黙に宣言されない
delete…暗黙に「=delete」と宣言される

  1. ユーザ宣言のデストラクタ・コピーコンストラクタ・コピー代入演算子があるという事はなんらかのリソース管理をしているはずであり、おそらくユーザ宣言のコピーコンストラクタ・コピー代入演算子が必要なのでムーブコンストラクタ・ムーブ代入演算子と同様に delete としたいがC++03以前との互換性のため暗黙に宣言されるようになっている。C++11の言語規格では非推奨(deprecated)とされている。 2 3 4

  2. ユーザ宣言のコピーコンストラクタ・コピー代入演算子・ムーブコンストラクタ・ムーブ代入演算子があるという事はなんらかのリソース管理をしているはずであり、おそらくユーザ宣言のデストラクタが必要と思われる。 2 3 4

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?