デフォルトコンストラクタ
デフォルトコンストラクタとは、引数なしで呼び出せるコンストラクタのことです。
目次 |
[編集] 構文
クラス名 (パラメータリスト (オプション)); |
(1) | ||||||||
クラス名 (パラメータリスト (オプション)) 関数本体 |
(2) | ||||||||
クラス名 () = default; |
(3) | (C++11以降) | |||||||
クラス名 (パラメータリスト (オプション)) = delete; |
(4) | (C++11以降) | |||||||
クラス名 ::クラス名 (パラメータリスト (オプション)) 関数本体 |
(5) | ||||||||
クラス名 ::クラス名 () = default; |
(6) | (C++11以降) | |||||||
| class-name | - | デフォルトコンストラクタが宣言されているクラス |
| parameter-list | - | すべてのパラメータ (パラメータパックを除く)(C++11以降)がデフォルト引数を持つパラメータリスト |
| 関数本体 | - | デフォルトコンストラクタの関数本体 |
[編集] 解説
デフォルトコンストラクタはデフォルト初期化および値初期化中に呼び出されます。
[編集] 暗黙的に宣言されるデフォルトコンストラクタ
クラス型にユーザー宣言されたコンストラクタまたはコンストラクタテンプレートがない場合、コンパイラはデフォルトコンストラクタをクラスのinline publicメンバーとして暗黙的に宣言します。
暗黙的に宣言された (または最初の宣言でデフォルト化された) デフォルトコンストラクタは、動的例外指定(C++17まで) noexcept指定(C++17以降)で記述されているような例外指定を持ちます。
[編集] 暗黙的に定義されるデフォルトコンストラクタ
コンストラクタが暗黙的に宣言されている場合(C++11まで)暗黙的に宣言された、または明示的にデフォルト化されたデフォルトコンストラクタが削除済みとして定義されていない場合(C++11以降)、odr-useされるか、定数評価のために必要とされる(C++11以降)と、コンパイラによって暗黙的に定義されます。
|
共用体ライクなクラス |
(C++26以降) |
暗黙的に定義されるデフォルトコンストラクタは(C++26まで)そうでなければ、暗黙的に定義されるデフォルトコンストラクタは(C++26以降)、空の本体と空の初期化子リストを持つユーザー定義コンストラクタと同じ効果を持ちます。つまり、このクラスの基底と非静的メンバーのデフォルトコンストラクタを呼び出します。空のユーザー提供コンストラクタを持つクラス型は、値初期化時に暗黙的に定義されたデフォルトコンストラクタを持つクラス型とは異なる扱いを受ける場合があります。
|
これがconstexprコンストラクタ(C++23まで)constexpr関数(C++23以降)の要件を満たす場合、生成されるコンストラクタはconstexprです。 ユーザー定義コンストラクタが存在する場合でも、ユーザーはdefaultキーワードを使用して、それ以外の場合に暗黙的に宣言されるデフォルトコンストラクタのコンパイラによる自動生成を強制することができます。 |
(C++11以降) |
削除されたデフォルトコンストラクタクラス
ユーザー定義コンストラクタが存在せず、暗黙的に宣言されたデフォルトコンストラクタが自明でない場合でも、ユーザーはdeleteキーワードを使用して、コンパイラによる暗黙的に定義されたデフォルトコンストラクタの自動生成を抑制することができます。 |
(C++11以降) |
[編集] 自明なデフォルトコンストラクタ
クラスTのデフォルトコンストラクタは、以下のすべての条件が満たされる場合に自明です。
- コンストラクタが暗黙的に宣言されている(C++11まで)ユーザー提供ではない(C++11以降)。
-
Tに仮想メンバー関数がない。 -
Tに仮想基底クラスがない。
|
(C++11以降) |
Tのすべての直接基底が自明なデフォルトコンストラクタを持つ。
|
(C++26まで) |
|
(C++26以降) |
自明なデフォルトコンストラクタとは、何もアクションを実行しないコンストラクタです。C言語と互換性のあるすべてのデータ型 (POD型) は、自明にデフォルト構築可能です。
[編集] 適格なデフォルトコンストラクタ
|
デフォルトコンストラクタは、ユーザー宣言されているか、暗黙的に宣言されていて定義可能である場合に適格です。 |
(C++11まで) |
|
デフォルトコンストラクタは、削除されていない場合に適格です。 |
(C++11以降) (C++20まで) |
|
デフォルトコンストラクタは、以下のすべての条件が満たされる場合に適格です。 |
(C++20以降) |
適格なデフォルトコンストラクタの自明性は、そのクラスが暗黙的生存期間型であるかどうか、および自明にコピー可能な型であるかどうかを決定します。
[編集] 備考
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__cpp_trivial_union |
202502L |
(C++26) | 共用体の特殊メンバー関数の自明性要件を緩和する |
[編集] 例
struct A { int x; A(int x = 1): x(x) {} // user-defined default constructor }; struct B : A { // B::B() is implicitly-defined, calls A::A() }; struct C { A a; // C::C() is implicitly-defined, calls A::A() }; struct D : A { D(int y) : A(y) {} // D::D() is not declared because another constructor exists }; struct E : A { E(int y) : A(y) {} E() = default; // explicitly defaulted, calls A::A() }; struct F { int& ref; // reference member const int c; // const member // F::F() is implicitly defined as deleted }; // user declared copy constructor (either user-provided, deleted or defaulted) // prevents the implicit generation of a default constructor struct G { G(const G&) {} // G::G() is implicitly defined as deleted }; struct H { H(const H&) = delete; // H::H() is implicitly defined as deleted }; struct I { I(const I&) = default; // I::I() is implicitly defined as deleted }; int main() { A a; B b; C c; // D d; // compile error E e; // F f; // compile error // G g; // compile error // H h; // compile error // I i; // compile error }
[編集] 欠陥報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| CWG 1353 | C++11 | 暗黙的に宣言されたデフォルトコンストラクタが 削除済みとして定義される条件が多次元配列型を考慮していなかった |
これらの型を考慮する |
| CWG 2084 | C++11 | デフォルトメンバー初期化子が、共用体の デフォルト化されたデフォルトコンストラクタが削除されるかどうかに影響を与えなかった |
それらはデフォルト化されたデフォルト コンストラクタが削除されるのを防ぐ |
| CWG 2595 | C++20 | より制約の強い別のデフォルトコンストラクタが存在する場合、 デフォルトコンストラクタは適格ではなかった だがその関連する制約を満たさない |
この場合でも適格になりうる。 |
| CWG 2871 | C++98 | ユーザー宣言されたコンストラクタテンプレートがあっても デフォルトコンストラクタが暗黙的に宣言される |
暗黙的な宣言なし この場合に |