...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

new Aとnew A()の違い

via. shinhさんとかuskzさんとか.

#include <iostream>

struct A
{
	int v;
};

struct B
{
	B(){}
	int v;
};

struct C
{
	C():v(){}
	int v;
};

int _tmain(int argc, _TCHAR* argv[])
{
	A* s = new A;
	A* t = new A();
	B* u = new B;
	B* v = new B();
	C* w = new C;
	C* x = new C();

	std::cout << "A\t"   << s->v << std::endl;
	std::cout << "A()\t" << t->v << std::endl;
	std::cout << "B\t"   << u->v << std::endl;
	std::cout << "B()\t" << v->v << std::endl;
	std::cout << "C\t"   << w->v << std::endl;
	std::cout << "C()\t" << x->v << std::endl;

	return 0;
}
A       -842150451
A()     0
B       -842150451
B()     -842150451
C       0
C()     0

なん・・・だと・・・!?
同じだと思ってたぞ.
暗黙に作られるデフォルトコンストラクタは,構造体Cのようにメンバをゼロ初期化する初期化子リスト付きのものが作られるらしい.そんな親切(?)な機能があったとは.賢いね.でもわざわざその機能使うか?
そしてオブジェクトの宣言時に()を付けると暗黙に作られたデフォルトコンストラクタが呼び出されるみたいだ.()付けなくても呼んだらいいのでは・・・?
なので,自分でデフォルトコンストラクタを作るときに初期化子リストを書かないと,たとえ()を付けてオブジェクトを宣言してもゼロ初期化されない.
はあ〜,そですか.