名前空間
変種
操作

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

From cppreference.com
< cpp‎ | language
 
 
C++言語
全般
フロー制御
条件実行文
if
繰り返し文 (ループ)
for
範囲for (C++11)
ジャンプ文
関数
関数宣言
ラムダ式
inline指定子
動的例外仕様 (C++17まで*)
noexcept指定子 (C++11)
例外
名前空間
指定子
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点数
文字 - 文字列 - nullptr (C++11)
ユーザー定義 (C++11)
ユーティリティ
属性 (C++11)
typedef宣言
型エイリアス宣言 (C++11)
キャスト
メモリ確保
クラス
クラス固有の関数プロパティ
explicit (C++11)
static

特殊メンバ関数
デフォルトコンストラクタ
コピーコンストラクタ
ムーブコンストラクタ (C++11)
テンプレート
その他
 
 

デフォルトコンストラクタとは、引数なしで呼び出せるコンストラクタのことです。

目次

[編集] 構文

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

[編集] 解説

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

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

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

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

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

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

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

共用体ライクなクラス T のデフォルトコンストラクタが自明である場合、T 自身であるか、T の匿名共用体メンバーである各共用体 U について、U の最初のバリアントメンバー (存在する場合) が暗黙的生存期間型を持つ場合、T のデフォルトコンストラクタは、そのメンバーがその共用体のアクティブなメンバーでない場合に、そのメンバーの生存期間を開始します。

(C++26以降)

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

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

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

(C++11以降)


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

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

  • Tがデフォルト初期化子を持たない参照型の非静的データメンバーを持つ。
  • T共用体クラスであり、かつ(C++26以降)デフォルトメンバー初期化子を持たない、非バリアントの非静的非const-デフォルト構築可能なconst修飾型 (またはその多次元配列) のデータメンバーを持つ。
  • T共用体であり、そのすべてのバリアントメンバーがconst修飾型 (またはその多次元配列) である。
  • Tが非共用体クラスであり、いずれかの匿名共用体メンバーのすべてのメンバーがconst修飾型 (またはその多次元配列) である。
(C++26まで)
  • Mが、デフォルトコンストラクタから削除済みまたはアクセス不能なデストラクタを持つ、かつobjが非バリアントであるか、objがデフォルトメンバー初期化子を持つ(C++26以降)
  • 以下のすべての条件が満たされます
  • objがデフォルト初期化子を持つ非静的データメンバーではない。
  • objが、他の非静的データメンバーがデフォルト初期化子を持つ共用体のバリアントメンバーではない(C++26まで)
  • Mのデフォルトコンストラクタを見つけるために適用されたオーバーロード解決が、使用可能な候補を返さない、またはobjがバリアントメンバーである場合、自明でない関数を選択する(C++26まで)

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

(C++11以降)

[編集] 自明なデフォルトコンストラクタ

クラスTのデフォルトコンストラクタは、以下のすべての条件が満たされる場合に自明です。

  • コンストラクタが暗黙的に宣言されている(C++11まで)ユーザー提供ではない(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) {} // 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 ユーザー宣言されたコンストラクタテンプレートがあっても
デフォルトコンストラクタが暗黙的に宣言される
暗黙的な宣言なし
この場合に

[編集] 関連項目

English 日本語 中文(简体) 中文(繁體)