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 };