12項 コンストラクタでは、代入よりも初期化を使おう

"コンストラクタでは、代入よりも初期化を使おう"


コンストラクタで代入を使った場合、下の例ではSTRINGのコンストラクタが2回、代入が1回行われます。

class STRING
{
public:
	STRING(const char *p = "NULL\n");
private:
	char *str;
	int size;
};

class C
{
public:
	C(const char *p = "NULL\n")
	{
		name = STRING(p);		//2, STRINGのコンストラクタ //3, 代入演算子
	}
	STRING name;				//1, nameのコンストラクタ
};


int main()
{
	C("Hello\n");
	...

初期化を使えば、STRINGのコンストラクタ1回のみで同じ動作を行えます。

class STRING
{
public:
	STRING(const char *p = "NULL\n");
private:
	char *str;
	int size;
};

class C
{
public:
	C(const char *p = "NULL\n") : name(p){}	//1, nameのコンストラクタ
	STRING name;				
};


int main()
{
	C("Hello\n");
	...


また、static const int以外のクラスメンバを初期化するには、初期化リストを使わなくてはなりません。

class C
{
	static const int i = 0; //OK
	const int i2 = 1; //NG
	static int i3 = 2; //NG
	static const float f = 0.0f; //NG
};