C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++におけるゼロ初期化とは?構文・適用条件・サンプルコードを解説

ゼロ初期化(Zero initialization)とは、C++においてオブジェクトの初期値をゼロに設定することを指します。明示的な初期化子が与えられなかった場合でも、変数が予測可能な状態で始まることを保証する重要な仕組みです。

構文

T{};
char array[n] = "";

波括弧 {} を用いた初期化や、空文字列による文字配列の初期化が、ゼロ初期化に該当します。

ゼロ初期化が行われる主なケース

  • 静的記憶域期間(static)またはスレッドローカル記憶域期間(thread_local)を持つ名前付き変数が、プログラム起動時にゼロで初期化される場合。

  • クラス型ではない基本的な型(int、floatなど)や、コンストラクタを持たないクラスのメンバーの初期化に利用される場合。

  • 文字配列の長さが、代入される文字数よりも大きい場合に、残りの要素を埋めるために利用される場合。

覚えておきたいポイント

  • static変数やthread_local変数などの一部の変数は、まずゼロで初期化された後、実際の初期化式が評価されるタイミングで改めて値が設定されます。この2段階の初期化により、未定義動作を防いでいます。

  • ゼロ初期化されたポインタはヌルポインタ(null pointer)と呼ばれ、どこも指していない有効な状態として扱われます。

サンプルコード

C++におけるゼロ初期化の動作を確認できるプログラムを以下に示します。

#include <iostream>
#include <string>
using namespace std;

struct zeroInitialization {
    int x, y, z;
};

float f[3];
int* p;
string s;

int main(int argc, char* argv[]){
    zeroInitialization obj = zeroInitialization();
    cout<<"Zero initialized object variable :\t";
    cout<<obj.x<<"\t"<<obj.y<<"\t"<<obj.z<<"\n";
    cout<<"Zero initialized float value :\t";
    cout<<f[0]<<"\t"<<f[1]<<"\t"<<f[2]<<"\n";
    cout<<"Zero initialized pointer value :\t";
    cout<<p<<"\n";
    return 0;
}

実行結果

Zero initialized object variable : 0 0 0
Zero initialized float value : 0 0 0
Zero initialized pointer value : 0

このように、グローバル変数として宣言された浮動小数点型の配列やポインタは、明示的に初期化しなくても自動的にゼロで初期化されていることが確認できます。特にポインタの場合、不定な値ではなくヌルポインタになるため、安全性の面で大きなメリットがあります。

  1. 【初心者向け】C/C++における多次元配列の初期化方法をわかりやすく解説

    多次元配列とは、次元数が2以上ある配列のことです。本記事では、3×3×3の多次元配列におけるメモリ割り当ての仕組みと、実際に配列を初期化して内容を表示するC++プログラムを紹介します。下図は、次元が3×3×3の多次元配列に対するメモリ割り当ての戦略を示したものです。アルゴリズム多次元配列を初期化するプログラムは、以下の手順で構成されます。Begin 多次元配列の要素を初期化する 配列のサイズを出力する 配列の内容を表示する Endサンプルコード以下は、2行2列の二次元配列を初期化し、そのサイズと内容を出力するC++プログラムです。#include<iostream

  2. C++でバイナリ行列をゼロ行列に変換するための最小反転回数を求める方法

    m × n のバイナリ行列(0 と 1 のみで構成された行列)mat が与えられます。1 ステップごとに、任意のセルを 1 つ選び、そのセルのビットと、存在する場合は上下左右 4 つの隣接セルのビットをすべて同時に反転することができます。mat をゼロ行列(全要素が 0 の行列)へ変換するために必要な最小ステップ数を求めてください。解が存在しない場合は -1 を返します。 たとえば、入力が [[0,0], [0,1]] の場合、変換の過程は次のようになります。 この場合、3 ステップが必要となるため、出力は 3 になります。 解き方のアプローチ:BFS(幅優先探索)とビットマスク この問