【C++】変数の初期化=0と{0}の違いとは?|使い分けをわかりやすく解説

サムネイル画像 C++

今回は、C++での「変数の初期化 =0 と {0} の違い」について解説していきます。

コードを書いていて、=0{0}のどちらで初期化すればいいのか迷ったことはありませんか?

この記事を読み終えると、あなたは初期化の使い分けをマスターできると思いますので、ぜひ最後まで読んでいただけると嬉しいです。

変数の初期化とは?

変数の初期化とは、変数を宣言すると同時に初期値を設定することです。

C++では、変数を初期化する方法がいくつかあります。

  • =0:代入演算子を使った初期化
  • {0}:波括弧を使った初期化(リスト初期化)
  • (0):コンストラクタ形式の初期化

今回は、特によく使われる=0{0}の違いに焦点を当てて解説します。

=0 による初期化

=0は、最も伝統的な初期化方法です。

▼main.cpp

#include <iostream>

int main() {
    int num = 0;
    double price = 0.0;
    
    std::cout << "num: " << num;
    std::cout << ", price: " << price;
    
    return 0;
}

実行結果

num: 0, price: 0

この方法は直感的でわかりやすく、基本型(int、doubleなど)の初期化に適しています。

{0} による初期化

{0}は、C++11から推奨されている初期化方法で、リスト初期化とも呼ばれます。

▼main.cpp

#include <iostream>

int main() {
    int num{0};
    double price{0.0};
    
    std::cout << "num: " << num;
    std::cout << ", price: " << price;
    
    return 0;
}

実行結果

num: 0, price: 0

一見すると=0と同じ結果ですが、実はいくつか重要な違いがあります。

=0 と {0} の違い

1. 配列の初期化

配列を初期化する場合、{0}の方がすべての要素をゼロで初期化できるため便利です。

▼main.cpp

#include <iostream>

int main() {
    int arr1[5] = {0}; // すべての要素が0になる
    int arr2[5]{0};    // こちらも同じ
    
    // arr1[5] = 0; は配列全体の初期化には使えない
    
    for(int i = 0; i < 5; i++) {
        std::cout << arr1[i] << " ";
    }
    
    return 0;
}

実行結果

0 0 0 0 0

配列の場合、=0だけでは初期化できず、={0}または{0}が必要です。

2. 暗黙的な型変換の防止

{0}を使うと、narrowing conversion(縮小変換)がエラーになります

▼main.cpp

#include <iostream>

int main() {
    int num1 = 3.14;  // OK(警告は出るが、コンパイルは通る)
    // int num2{3.14}; // エラー!小数を整数に変換できない
    
    std::cout << "num1: " << num1; // 3が出力される
    
    return 0;
}

=を使うと小数が整数に暗黙的に変換されてしまいますが{}を使うとコンパイルエラーになります。

これにより、意図しない型変換によるバグを防ぐことができます

3. 構造体の初期化

構造体を初期化する場合も、{}の方が便利です。

▼main.cpp

#include <iostream>

struct Point {
    int x;
    int y;
};

int main() {
    Point p1 = {0, 0};  // OK
    Point p2{0, 0};     // OK(C++11以降推奨)
    Point p3{};         // すべてのメンバが0で初期化される
    
    std::cout << "p3.x: " << p3.x;
    std::cout << ", p3.y: " << p3.y;
    
    return 0;
}

実行結果

p3.x: 0, p3.y: 0

{}だけで書くと、すべてのメンバ変数がゼロで初期化されるため便利です。

4. クラスの初期化

クラスのメンバ変数を初期化する場合、{}を使うとコンストラクタを呼び出せます。

▼main.cpp

#include <iostream>
#include <string>

class Person {
public:
    std::string name;
    int age;
};

int main() {
    Person person1{"Taro", 20}; // OK
    // Person person2 = "Taro", 20; // エラー
    
    std::cout << person1.name << ": " << person1.age;
    
    return 0;
}

実行結果

Taro: 20

どちらを使うべき?

基本的には{0}(リスト初期化)を使うのが推奨されます。

理由は以下の通りです。

  • 型安全:意図しない型変換を防げる
  • 統一性:配列、構造体、クラスなど、どんな型でも同じ書き方ができる
  • モダンC++:C++11以降の標準的な書き方

ただし、=0も間違いではなく、シンプルな基本型の初期化では十分使えます

まとめ

=0{0}の違いをまとめます。

  • =0:伝統的な初期化方法。基本型に使いやすい
  • {0}:C++11以降推奨。型安全で配列・構造体・クラスにも対応
  • 配列やクラスの初期化には{}が便利
  • 縮小変換を防ぎたい場合は{}を使う

これで初期化の使い分けはバッチリですね!

モダンなC++を書く際は、ぜひ{}を活用してみてください。

ここまで読んでくださり、ありがとうございました。

この記事が皆様の学習に役立てば幸いです。