今回は、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++を書く際は、ぜひ{}を活用してみてください。
ここまで読んでくださり、ありがとうございました。
この記事が皆様の学習に役立てば幸いです。


