Namespaces
Variants

Default constructors

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Default constructor
Copy constructor
Move constructor (C++11)
Templates
Miscellaneous

デフォルトコンストラクタは、 コンストラクタ であり、引数なしで呼び出すことができます。

目次

構文

class-name  ( parameter-list  (オプション) ); (1)
class-name  ( parameter-list  (オプション) ) function-body (2)
class-name  () = default; (3) (C++11以降)
class-name  ( parameter-list  (オプション) ) = delete; (4) (C++11以降)
class-name  :: class-name  ( parameter-list  (オプション) ) function-body (5)
class-name  :: class-name  () = default; (6) (C++11以降)
class-name - デフォルトコンストラクタが宣言されているクラス
parameter-list - パラメータリスト で、すべてのパラメータが ( パラメータパック を除く) (C++11以降) デフォルト引数 を持つもの
function-body - デフォルトコンストラクタの 関数本体

説明

1) クラス定義内でのデフォルトコンストラクタの宣言。
2-4) クラス定義内でのデフォルトコンストラクタの定義。
3) デフォルトコンストラクタは明示的にデフォルト化されています。
4) デフォルトコンストラクタは削除されています。
5,6) クラス定義外でのデフォルトコンストラクタの定義(クラスは宣言を含まなければならない (1) )。
6) デフォルトコンストラクタは明示的にデフォルト化されています。

デフォルトコンストラクタは デフォルト初期化 および 値初期化 の際に呼び出されます。

暗黙的に宣言されるデフォルトコンストラクタ

クラス型にユーザー宣言されたコンストラクタまたはコンストラクタテンプレートが存在しない場合、コンパイラは暗黙的にデフォルトコンストラクタをそのクラスの inline public メンバーとして宣言します。

暗黙的に宣言された(または最初の宣言でデフォルト化された)デフォルトコンストラクタは、以下のように例外指定を持ちます: 動的例外指定 (C++17まで) noexcept指定 (C++17以降)

暗黙的に定義されるデフォルトコンストラクタ

もし コンストラクタが暗黙的に宣言されている場合 (C++11まで) 暗黙的に宣言された、または明示的にデフォルト化されたデフォルトコンストラクタが削除済みとして定義されていない場合 (C++11以降) 、コンパイラによって暗黙的に定義されるのは odr-used されるか、 定数評価に必要とされる場合 、または最初の宣言後に明示的にデフォルト化されたとき (C++11以降) です。

union-likeクラス T のデフォルトコンストラクタがトリビアルである場合、各ユニオン U T 自体または T の匿名ユニオンメンバ)について、 U の最初のバリアントメンバ(存在する場合)が 暗黙的ライフタイム型 を持つとき、 T のデフォルトコンストラクタは、そのメンバが自身のユニオンのアクティブメンバでない場合にそのメンバのライフタイムを開始する。

(C++26以降)

暗黙的に定義されたデフォルトコンストラクタは、 (C++26まで) それ以外の場合、暗黙的に定義されたデフォルトコンストラクタは、 (C++26以降) 空の本体と空の初期化子リストを持つユーザー定義コンストラクタと同じ効果を持ちます。つまり、基底クラスとこのクラスの非静的メンバのデフォルトコンストラクタを呼び出します。空のユーザー提供コンストラクタを持つクラス型は、暗黙的に定義されたデフォルトコンストラクタを持つものとは異なる扱いを受ける可能性があります 値初期化 の間。

これが constexpr コンストラクタ (C++23まで) constexpr 関数 (C++23以降) の要件を満たす場合、生成されるコンストラクタは constexpr となります。

ユーザー定義のコンストラクタが存在する場合でも、ユーザーは default キーワードを使用して、暗黙的に宣言されるデフォルトコンストラクタの自動生成をコンパイラに強制することができます。

(C++11以降)


削除されたデフォルトコンストラクタ

クラス T の暗黙的に宣言された、または明示的にデフォルト化されたデフォルトコンストラクタは、以下のいずれかの条件が満たされる場合に削除されたものとして定義されます:

  • T がデフォルト初期化子を持たない参照型の非静的データメンバを持つ場合。
  • T が非 union クラスであり、 (C++26以降) デフォルトメンバ初期化子を持たないconst修飾型(またはその多次元配列)の非variant非静的const-default-constructibleでないデータメンバを持つ場合。
  • T union であり、そのすべてのvariantメンバがconst修飾型(またはその多次元配列)である場合。
  • T が非unionクラスであり、任意の 匿名union メンバのすべてのメンバがconst修飾型(またはその多次元配列)である場合。
(C++26以前)
  • M が削除されているか、デフォルトコンストラクタからアクセスできないデストラクタを持ち、 かつ obj が非variantであるか、 obj がデフォルトメンバ初期化子を持つ場合 (C++26以降)
  • 以下のすべての条件が満たされる場合:
  • obj がデフォルト初期化子を持つ非静的データメンバではない。
  • obj がvariantメンバではなく、 または他の非静的データメンバがデフォルト初期化子を持つunionのvariantメンバではない (C++26以前)
  • M のデフォルトコンストラクタを見つけるためのオーバーロード解決が使用可能な候補を結果としないか、 obj がvariantメンバの場合、非自明な関数を選択する場合 (C++26以前)

ユーザー定義のコンストラクタが存在せず、暗黙的に宣言されたデフォルトコンストラクタが自明でない場合でも、ユーザーはキーワード delete を使用して、コンパイラによる暗黙的に定義されたデフォルトコンストラクタの自動生成を抑制することができます。

(C++11以降)

自明なデフォルトコンストラクタ

T クラスのデフォルトコンストラクタは、以下の条件をすべて満たす場合、トリビアルとなります:

  • コンストラクタは 暗黙的に宣言される (C++11まで) ユーザー提供ではない user-provided (C++11以降)
  • T は仮想メンバー関数を持たない。
  • T は仮想基底クラスを持たない。
  • T はデフォルト初期化子を持つ非静的メンバーを持たない。
(C++11以降)
  • T のすべての直接基底クラスは自明なデフォルトコンストラクタを持ちます。
  • クラス型(またはその配列)のすべての非静的メンバがトリビアルなデフォルトコンストラクタを持つ。
(C++26まで)
  • T が共用体であるか、またはクラス型(またはその配列)のすべての非バリアント非静的メンバがトリビアルなデフォルトコンストラクタを持つ。
(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) {} // ユーザー定義のデフォルトコンストラクタ
};
struct B : A
{
    // B::B() は暗黙的に定義され、A::A() を呼び出す
};
struct C
{
    A a;
    // C::C() は暗黙的に定義され、A::A() を呼び出す
};
struct D : A
{
    D(int y) : A(y) {}
    // 他のコンストラクタが存在するため、D::D() は宣言されない
};
struct E : A
{
    E(int y) : A(y) {}
    E() = default; // 明示的にデフォルト化、A::A() を呼び出す
};
struct F
{
    int& ref; // 参照メンバ
    const int c; // const メンバ
    // F::F() は暗黙的に削除済みとして定義される
};
// ユーザー宣言されたコピーコンストラクタ(ユーザー提供、削除済み、またはデフォルト化)は
// デフォルトコンストラクタの暗黙的な生成を妨げる
struct G
{
    G(const G&) {}
    // G::G() は暗黙的に削除済みとして定義される
};
struct H
{
    H(const H&) = delete;
    // H::H() は暗黙的に削除済みとして定義される
};
struct I
{
    I(const I&) = default;
    // I::I() は暗黙的に削除済みとして定義される
};
int main()
{
    A a;
    B b;
    C c;
//  D d; // コンパイルエラー
    E e;
//  F f; // コンパイルエラー
//  G g; // コンパイルエラー
//  H h; // コンパイルエラー
//  I i; // コンパイルエラー
}

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用バージョン 公開時の仕様 修正後の仕様
CWG 1353 C++11 暗黙的に宣言されるデフォルトコンストラクタが削除済みとして定義される条件に
多次元配列型が考慮されていなかった
これらの型を考慮する
CWG 2084 C++11 デフォルトメンバ初期化子が、unionのデフォルト化された
デフォルトコンストラクタが削除済みかどうかに影響を与えなかった
これらはデフォルト化されたデフォルトコンストラクタが
削除済みとなることを防止する
CWG 2595 C++20 より制約されているが関連制約を満たさない別の
デフォルトコンストラクタが存在する場合、
デフォルトコンストラクタは適格ではなかった
この場合でも適格となりうる
CWG 2871 C++98 ユーザー宣言されたコンストラクタテンプレートが
存在する場合でもデフォルトコンストラクタが
暗黙的に宣言されていた
この場合、暗黙的な宣言は行われない

関連項目