名前空間
変種
操作

ゼロ初期化

提供: cppreference.com
< cpp‎ | language
 
 
C++言語
一般的なトピック
フロー制御
条件付き実行文
繰り返し文 (ループ)
ジャンプ文
関数
関数宣言
ラムダ関数宣言
inline 指定子
例外指定 (非推奨)
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
メモリ確保
クラス
クラス固有の関数特性
特別なメンバ関数
テンプレート
その他
 
 

オブジェクトの初期値をゼロに設定します。

目次

[編集] 構文

static T object ; (1)
T () ;

T t = {} ;
T {} ;

(2)

(C++11およびそれ以降)
char array [ n ] = ""; (3)

[編集] 説明

ゼロ初期化は以下の状況で行われます。

1) 静的またはスレッドローカル記憶域期間を持つ定数初期化の対象でない (C++14およびそれ以降)すべての名前付き変数について、他のいかなる初期化も行われる前に。
2) 非クラス型およびコンストラクタを持たない値初期化されるクラス型 (初期化子が提供されない集成体の要素の値初期化を含みます) のメンバについて、値初期化のシーケンスの一部として。
3) 文字配列が短すぎる文字列リテラルで初期化されるとき、配列の残りはゼロ初期化されます。

ゼロ初期化の効果は以下の通りです。

  • T がスカラー型の場合は、オブジェクトの初期値は T明示的に変換された整数定数のゼロです。
  • T が共用体でないクラス型の場合は、すべての基底クラスおよび非静的データメンバがゼロ初期化され、すべてのパディングがゼロビットに初期化されます。 コンストラクタは、もしあっても、無視されます。
  • T が共用体型の場合は、その最初の名前付き非静的データメンバがゼロ初期化され、すべてのパディングはゼロビットに初期化されます。
  • T が配列型の場合は、各要素がゼロ初期化されます。
  • T が参照型の場合は、何も行われません。

[編集] ノート

非ローカル初期化で説明されているように、定数初期化されない (C++14およびそれ以降)静的およびスレッドローカル変数は他のいかなる初期化も行われる前にゼロ初期化されます。 非クラスな非ローカル変数の定義が初期化子を持たない場合、デフォルト初期化は何も行わず、先のゼロ初期化の結果が変更されずに残されます。

ゼロ初期化されたポインタはその型のヌルポインタ値です (たとえヌルポインタの値が整数のゼロでなくても)。

[編集]

#include <string>
#include <iostream>
 
struct A {
    int a,b,c;
};
 
double f[3]; // 3つの 0.0 にゼロ初期化されます。
int* p;   // ヌルポインタ値にゼロ初期化されます。
std::string s; // 不定値にゼロ初期化され、その後 "" にデフォルト初期化されます。
int main(int argc, char* argv[])
{
    A a = A();
    std::cout << a.a << a.b << a.c << '\n';
    static int n = argc; // 0 にゼロ初期化され、その後 argc にコピー初期化されます。
    delete p; // ヌルポインタの削除は安全です。
}

出力:

000

[編集] 欠陥報告

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

DR 適用先 発行時の動作 正しい動作
CWG 2026 C++14 zero-init was specified to always occur first, even before constant-init no zero-init if constant init applies

[編集] 関連項目