1. ホーム
  2. c++

[解決済み】オブジェクトの初期化で{0}が意味するものは何ですか?

2022-04-04 14:25:10

質問

いつ {0} がオブジェクトの初期化に使われていますが、これは何を意味するのでしょうか?への言及は見当たりません。 {0} また、中括弧があるため、Google検索は役に立ちません。

コード例です。

SHELLEXECUTEINFO sexi = {0}; // what does this do?
sexi.cbSize = sizeof(SHELLEXECUTEINFO);
sexi.hwnd = NULL;
sexi.fMask = SEE_MASK_NOCLOSEPROCESS;
sexi.lpFile = lpFile.c_str();
sexi.lpParameters = args;
sexi.nShow = nShow;

if(ShellExecuteEx(&sexi))
{
    DWORD wait = WaitForSingleObject(sexi.hProcess, INFINITE);
    if(wait == WAIT_OBJECT_0)
        GetExitCodeProcess(sexi.hProcess, &returnCode);
}

これがないと、上記のコードは実行時にクラッシュします。

解決方法は?

ここで起きているのは アグリゲート を初期化します。 以下は、ISO仕様のセクション8.5.1における集約の(省略された)定義です。

集約は、ユーザ宣言されたコンストラクタ、プライベートまたは保護された非静的データメンバ、基底クラス、および仮想関数を持たない配列またはクラスです。

では {0} を使ってこのように集約を初期化することは、基本的にトリックで 0 というように、全体を というのも、集合体初期化を使用する場合 のすべてのメンバーを指定する必要はありません。 で、仕様では指定されていないメンバはすべてデフォルトで初期化されることになっており、つまりは 0 単純な型の場合

以下は、仕様書からの該当箇所の引用です。

リスト内の初期化子の数が、リスト内のメンバの数より少ない場合。 集合体でない各メンバーは 明示的に初期化されなければならない。 デフォルトで初期化される。 例

struct S { int a; char* b; int c; };
S ss = { 1, "asdf" };

初期化 ss.a1 , ss.b"asdf" であり、かつ ss.c の値で という形式の式があります。 int() ということである。 0 .

このトピックに関する完全な仕様書をご覧いただけます。 こちら