名前空間
変種
操作

デフォルト初期化

提供: 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
メモリ確保
クラス
クラス固有の関数特性
特別なメンバ関数
テンプレート
その他
 
 

変数が初期化子なしで構築されたときに行われる初期化です。

目次

[編集] 構文

T object ; (1)
new T

new T ( ) (C++03未満)

(2)

[編集] 説明

デフォルト初期化は以下の3つの状況で行われます。

1) 自動、静的、またはスレッドローカル記憶域期間を持つ変数が初期化子なしで宣言されたとき。
2) 動的記憶域期間持つオブジェクトが初期化子なしの new 式によって作成されたときまたは空の括弧から構成される初期化子を用いた new 式によって作成されたとき (C++03未満)
3) 基底クラスまたは非静的データメンバがコンストラクタの初期化子リストで言及されておらず、そのコンストラクタが呼ばれたとき。

デフォルト初期化の効果は以下の通りです。

  • T POD でない (C++11未満)クラス型の場合は、そのコンストラクタが考慮され、空の引数リストに対するオーバーロード解決の対象となります。 選択されたコンストラクタ (デフォルトコンストラクタのいずれかになります) がその新しいオブジェクトに初期値を提供するために呼ばれます。
  • T が配列型の場合は、その配列の要素がデフォルト初期化されます。
  • そうでなければ、何も行われません。 自動記憶域期間を持つオブジェクト (およびその部分オブジェクト) は不定の値に初期化されます。

初期化子が使用されない場合、自動記憶域期間を持つ POD でないクラス型 (またはその cv 修飾された型) (またはその配列) のみがデフォルト初期化されるものとみなされます。 動的記憶域期間を持つスカラー型および POD 型は初期化されないものとみなされます (C++11 以降、この状況はデフォルト初期化の形式のひとつとして分類し直されました)。

(C++11未満)

C++03 (値初期化が導入された) より前では、式 new T()、および基底クラスまたはメンバのメンバ初期化子の空の括弧の形式は、デフォルト初期化として分類されますが、非クラス型の場合はゼロ初期化と規定されます。

(C++03未満)

T が cv 修飾された型の場合、デフォルト初期化の目的に対してはその cv 修飾されていないバージョンが使用されます。

(C++11未満)

何らかの型の非クラス変数をデフォルト初期化することによって取得した不定値の使用は未定義動作です (特に、トラップ表現である可能性があります)。 ただし以下の場合を除きます。

  • unsigned char または std::byte (C++17以上) 型の不定値がunsigned char (cv 修飾されていても構いません) または std::byte (C++17以上) 型の別の変数に代入される場合 (その変数の値は不定値になりますが、動作は未定義ではありません)。
  • unsigned char または std::byte (C++17以上) 型の不定値がunsigned char (cv 修飾されていても構いません) または std::byte (C++17以上) 型の別の変数を初期化するために使用される場合。
  • unsigned char または std::byte (C++17以上) 型の不定値が以下のいずれかから来た場合。
  • 条件式の第2または第3被演算子。
  • コンマ演算子の右側の被演算子。
  • unsigned char (cv 修飾されていても構いません) または std::byte (C++17以上) への変換またはキャストの被演算子。
  • 符号なしナロー文字型または std::byte へのキャストまたは変換の被演算子。
  • 値を破棄する式。
int f(bool b)
{
    int x;               // OK。 x の値は不定です。
    int y = x;           // 未定義動作。
    unsigned char c;     // OK。 c の値は不定です。
    unsigned char d = c; // OK。 d の値は不定です。
    int e = d;           // 未定義動作。
    return b ? d : 0;    // b が真の場合は未定義動作。
}
(C++14以上)

[編集] ノート

自動および動的記憶域期間を持つ非クラス変数のデフォルト初期化は不定値を持つオブジェクトを生成します (静的およびスレッドローカルなオブジェクトはゼロ初期化されます)。

T が const 修飾された型の場合は、ユーザ提供のデフォルトコンストラクタを持つクラス型でなければなりません。

参照はデフォルト初期化できません。

[編集]

#include <string>
 
struct T1 { int mem; };
 
struct T2
{
    int mem;
    T2() { } // 「mem」が初期化子リストに無い。
};
 
int n; // 静的な非クラス。 2段階の初期化が行われます。
       // 1) ゼロ初期化が n をゼロに初期化します。
       // 2) デフォルト初期化は何もしません。 n はゼロのままになります。
 
int main()
{
    int n;            // 非クラス。 値は不定です。
    std::string s;    // クラス。 デフォルトコンストラクタを呼びます。 値は "" (空文字列) です。
    std::string a[2]; // 配列。 要素をデフォルト初期化します。 値は {"", ""} です。
//  int& r;           // エラー。 参照。
//  const int n;      // エラー。 const な非クラス。
//  const T1 t1;      // エラー。 暗黙のデフォルトコンストラクタを持つ const なクラス。
    T1 t1;            // クラス。 暗黙のデフォルトコンストラクタを呼びます。
    const T2 t2;      // const なクラス。 ユーザ定義のデフォルトコンストラクタを呼びます。
                      // t2.mem はデフォルト初期化されます (不定値になります)。
}


[編集] 関連項目