名前空間
変種
操作

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

提供: cppreference.com
< cpp‎ | language
 
 
C++言語
一般的なトピック
フロー制御
条件付き実行文
繰り返し文 (ループ)
ジャンプ文
関数
関数宣言
ラムダ関数宣言
inline 指定子
例外指定(C++20未満)
noexcept 指定子(C++11)
例外
名前空間
指定子
decltype(C++11)
auto(C++11)
alignas(C++11)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点
文字 - 文字列 - nullptr(C++11)
ユーザ定義(C++11)
ユーティリティ
属性(C++11)
typedef 宣言
型エイリアス宣言(C++11)
キャスト
暗黙の変換 - 明示的な変換
static_cast - dynamic_cast
const_cast - reinterpret_cast
メモリ確保
クラス
クラス固有の関数特性
特別なメンバ関数
デフォルトコンストラクタ
コピーコンストラクタ
ムーブコンストラクタ(C++11)
テンプレート
その他
 
 

デフォルトコンストラクタは引数なしで呼ぶことができるコンストラクタです (空の引数リストを用いて宣言されたか、すべての引数に対してデフォルト引数が提供されているかの、いずれかです)。 パブリックなデフォルトコンストラクタを持つ型は DefaultConstructible です。

目次

[編集]構文

class_name(); (1)
class_name::class_name()body (2)
class_name()=delete; (3) (C++11以上)
class_name()=default; (4) (C++11以上)
class_name::class_name()=default; (5) (C++11以上)

ただし class_name は現在のクラス (またはクラステンプレートの現在の実体化) を表さなければなりません。 または、名前空間スコープまたはフレンド宣言で宣言されたときは、修飾されたクラス名でなければなりません。

[編集]説明

1) クラス定義の内側のデフォルトコンストラクタの宣言。
2) クラス定義の外側のコンストラクタの宣言 (クラスは宣言 (1) を含まなければなりません)。 コンストラクタの body の詳細についてはコンストラクタとメンバ初期化子リストを参照してください。
3) 削除されたデフォルトコンストラクタ。 これがオーバーロード解決によって選択された場合、プログラムはコンパイルに失敗します。
4) デフォルト化されたデフォルトコンストラクタ。 コンパイラは、たとえ他のコンストラクタが存在する場合でも、暗黙のデフォルトコンストラクタを定義します。
5) クラス定義の外側のデフォルト化されたデフォルトコンストラクタ (クラスは宣言 (1) を含まなければなりません)。 このようなコンストラクタはユーザ提供として扱われます (下記および値初期化を参照してください)。

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

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

クラス型 (structclass または union) に対していかなる種類のユーザ宣言されたコンストラクタも提供されない場合、コンパイラは常にそのクラスの inline public メンバとしてデフォルトコンストラクタを宣言します。

何らかのユーザ宣言されたコンストラクタが存在する場合でも、ユーザはキーワード default を用いて、そうでなければ暗黙に宣言されたであろうコンパイラによるデフォルトコンストラクタの自動生成を、強制することができます。(C++11以上)

暗黙に宣言された (または最初の宣言でデフォルト化された) デフォルトコンストラクタは、動的例外指定(C++17未満)例外指定(C++17以上)で説明されている通りの例外指定を持ちます。

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

暗黙に定義されたデフォルトコンストラクタが削除されたものとして定義されない場合は、 ODR 使用されれば、コンパイラによって定義され (つまり関数の本体が生成されてコンパイルされ)、空の本体と空の初期化子リストを持つユーザ定義コンストラクタと正確に同じ効果を持ちます。 つまり、そのクラスの基底および非静的メンバのデフォルトコンストラクタを呼びます。 これが constexpr コンストラクタの要件を満たす場合は、生成されるコンストラクタは constexpr です。(C++11以上)

何らかのユーザ定義コンストラクタが存在する場合でも、ユーザはキーワード default を用いて、そうでなければ暗黙に宣言されたであろうコンパイラによるデフォルトコンストラクタの自動生成を、強制することができます。(C++11以上)

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

暗黙に宣言されたまたはデフォルト化されたクラス T に対するデフォルトコンストラクタは、以下のいずれかが真の場合、未定義です(C++11未満)削除されたものとして定義されます(C++11以上)

  • Tデフォルト初期化子のない(C++11以上)参照型のメンバを持つ。
  • T がユーザ定義のデフォルトコンストラクタまたはデフォルトメンバ初期化子(C++11以上)のない const メンバを持つ。
  • T(デフォルトメンバ初期化子のない)(C++11以上) 削除されたデフォルトコンストラクタを持つメンバ初期化子を持つ、またはそのデフォルトコンストラクタが曖昧またはこのコンストラクタからアクセス不可能である。
  • T が削除されたデフォルトコンストラクタを持つ直接または仮想の基底を持つ、またはそれが曖昧またはこのコンストラクタからアクセス不可能である。
  • T が削除されたデストラクタまたはこのコンストラクタからアクセス不可能なデストラクタを持つ直接または仮想の基底を持つ。
  • T が非トリビアルなデフォルトコンストラクタを持つ変種メンバを少なくとも1つ持つ union であり、 T のいずれの変種メンバもデフォルトメンバ初期化子を持たない。
  • T が非トリビアルなデフォルトコンストラクタを持つ変種メンバ M を持つ非 union クラスであり、 M を含んでいる無名共用体のいずれの変種メンバもデフォルトメンバ初期化子を持たない。
(C++11以上)
  • Tunion であり、そのすべての変種メンバが const である。
ユーザ定義コンストラクタが存在せず、暗黙に宣言されるデフォルトコンストラクタがトリビアルでない場合でも、ユーザはキーワード delete を用いて、コンパイラによって暗黙に定義されるデフォルトコンストラクタの自動生成を抑制できます。(C++11以上)

[編集]トリビアルなデフォルトコンストラクタ

以下の内容がすべて真の場合、クラス T のデフォルトコンストラクタはトリビアルです (すなわち、何も行いません)。

  • コンストラクタがユーザ提供されない (すなわち、最初の宣言において暗黙に定義されたかデフォルト化された)。
  • T が仮想メンバ関数を持たない。
  • T が仮想基底クラスを持たない。
  • T がデフォルト初期化子を持つ非静的メンバを持たない。
(C++11以上)
  • T のすべての直接の基底がトリビアルなデフォルトコンストラクタを持つ。
  • クラス型のすべての非静的メンバがトリビアルなデフォルトコンストラクタを持つ。

トリビアルなデフォルトコンストラクタは何も行わないコンストラクタです。 C 言語と互換性のあるすべてのデータ型 (POD 型) はトリビアルにデフォルト構築可能です。 しかし、 C の場合と異なり、トリビアルなデフォルトコンストラクタを持つオブジェクトは、適切にアラインされた記憶域 (std::malloc で確保されたメモリなど) を単純に再解釈することによっては作成できません。 正式に新しいオブジェクトを導入し、潜在的な未定義動作を避けるためには、配置 new が要求されます。

[編集] 欠陥報告

以下の動作変更欠陥報告は以前に発行された C++ 標準に遡って適用されました。

DR 適用先 発行時の動作 正しい動作
CWG 2084 C++11 default member initializers have no effect on
whether a defaulted default constructor of a union is deleted
they prevent the defaulted default constructor
from being defined as deleted

[編集]

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;// 参照メンバ。constint c;// const メンバ。// F::F() は削除されたものとして暗黙に定義されます。};   int main(){ A a; B b; C c;// D d; // コンパイルエラー。 E e;// F f; // コンパイルエラー。}


close