p_tan's blog

勉強日記です。ツッコミ大歓迎

POD型の初期化

参考サイト C++における構造体の初期化 | 株式会社きじねこ

POD(Plain Old Data)型の初期化には集成体(aggregate)用の{}による初期化とは別に値初期化というものが使えるらしい。
以下VC++2005 Express Editionの実行結果と共に。

#include <vector>
#include <iostream>

// POD型
struct A{
	int a;
	double b;
};

int main()
{
	A a = {};	// POD型はaggregate(集成体)なので{}で初期化できる
	std::cout << a.a << "\t" << a.b << "\n";	// 0	0
	A aa[1] = {};	// aggregateの配列はaggregateなので{}で初期化できる
	std::cout << aa[0].a << "\t" << aa[0].b << "\n";	// 0	0

	A *pa = new A;	// 初期化されない
	std::cout << pa->a << "\t" << pa->b << "\n";	// 不定値
	delete pa;
	pa = new A();	// 値初期化
	std::cout << pa->a << "\t" << pa->b << "\n";	// 0	0
	delete pa;

	A *paa = new A[1]; // 初期化されない
	std::cout << paa[0].a << "\t" << paa[0].b << "\n";	// 不定値
	delete[] paa;
	paa = new A[1]();	// 動的配列も値初期化可能
	std::cout << paa[0].a << "\t" << paa[0].b << "\n";	// 0	0
	delete[] paa;

	std::vector<A> va(1);	// vectorもデフォルトで値初期化を使用
	std::cout << va.back().a << "\t" << va.back().b << "\n";	// 0	0

	return 0;
}