ゼロ初期化 - cppreference.com
提供: cppreference.com
オブジェクトの初期値をゼロに設定します。
構文
これはゼロ初期化のための構文ではありません (言語に専用の構文はありません)。これらはゼロ初期化を実行しうる他の種類の初期化の例です。
static T object ;
|
(1) | ||||||||
T () ;
T t T |
(2) | ||||||||
CharT array [ n ] = " short-sequence ";
|
(3) | ||||||||
説明
ゼロ初期化は以下の状況で行われます。
1) 静的またはスレッドローカル記憶域期間を持つ定数初期化の対象でない (C++14以上)すべての名前付き変数について、他のいかなる初期化も行われる前に。
2) 非クラス型およびコンストラクタを持たない値初期化されるクラス型 (初期化子が提供されない集成体の要素の値初期化を含みます) のメンバについて、値初期化のシーケンスの一部として。
ゼロ初期化の効果は以下の通りです。
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*/[]) { delete p; // ヌルポインタの削除は安全です。 static int n = argc; // 0 にゼロ初期化され、その後 argc にコピー初期化されます。 std::cout << "n = " << n << '\n'; A a = A(); // 効果は A a{}; または A a = {}; と同じ。 std::cout << "a = {" << a.a << ' ' << a.b << ' ' << a.c << "}\n"; }
出力例:
欠陥報告
以下の動作変更欠陥報告は以前に発行された 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 |