C.48:定数初期化子のコンストラクタのメンバ初期化子に、クラス初期化子を優先する
C.48:コンストラクタは、定数でメンバーを初期化するために、より適切なクラス初期化子の使用を必要とする場合
理由(理由)
同じ値がすべてのコンストラクタで使用されることが期待されていること、それが明示的にします。回避の繰り返し。回避のメンテナンスの問題。これは、最短かつ最も効率的なコードにつながります。
明らかに、すべてのコンストラクタは同じ値を使用することへの期待を表明。メンテナンスの問題を避けてください。あなたは最短、最も効率的なコードを生成することができます。
例えば、悪い(陰性試料)
class X { // BAD
int i;
string s;
int j;
public:
X() :i{666}, s{"qqq"} { } // j is uninitialized
X(int ii) :i{ii} {} // s is "" and j is uninitialized
// ...
};
どうでしょうjが故意に(おそらく貧弱なアイデアとにかくを)初期化されていないとされたかどうかメンテナのノウハウ、それは別の(ほぼ確実バグ)で1ケースとQQQには「」意図的に与えるのデフォルト値であったかどうか?新しいメンバーは、既存のクラスに追加されたときにjが(メンバーを初期化するために忘れる)との問題がしばしば起こります。
(これは悪い考えかもしれないが)保守担当者はどのように私はjは故意に初期化されていないかどうかを知ることができますか?QQQ「別のケースに初期化されている間、「Sは、(これはほぼ間違いである)、それ意図的である」状況は」に初期化する方法を知っているのだろうか?Jの問題では、多くの場合、授業時間に新しいメンバーを追加することで発生する(メンバーを初期化するために忘れてしまいました)。
実施例(実施例)
class X2 {
int i {666};
string s {"qqq"};
int j {0};
public:
X2() = default; // all members are initialized to their defaults
X2(int ii) :i{ii} {} // s and j initialized to their defaults
// ...
};
オルタナティブ(代替)
私たちは、コンストラクタにデフォルト引数からの利益の一部を取得することができ、それは古いコードでは珍しいことではありません。しかし、あまり明示的であること、より多くの引数が渡されることになり、かつ複数のコンストラクタがある場合には、繰り返しです。
デフォルトコンストラクタ引数を使用することにより、我々はいくつかの利点を得ることができます。この状況は、古いコードでは非常に一般的なことができます。しかし、このアプローチは、それがより多くのパラメータが渡される原因となる、明確さを欠いていると、コードが複数のコンストラクタ、多くの問題の存在下で繰り返される原因となります。
class X3 { // BAD: inexplicit, argument passing overhead
int i;
string s;
int j;
public:
X3(int ii = 666, const string& ss = "qqq", int jj = 0)
:i{ii}, s{ss}, j{jj} { } // all members are initialized to their defaults
// ...
};
施行(提案)
-
(シンプル)すべてのコンストラクタは(委任ctorの呼び出しを介して、またはデフォルトの建設を経て、明示的に)すべてのメンバ変数を初期化する必要があります。
(シンプル)すべてのコンストラクタは、各メンバーを初期化する必要があります(明示的にコンストラクタやデフォルトコンストラクタによって委託することができます)
-
コンストラクタへ(簡単な)デフォルトの引数は、クラス初期化子がより適切かもしれない示唆しています。
-
クラス初期化子を使用して、デフォルトコンストラクタのパラメータのための(シンプル)は、より適切な選択かもしれません。
私はこの記事は参考になりましだと思いますか?ようこそ親指アップし、より多くの人と共有することができます。
より多くの更新の記事を読む、オブジェクト指向の考え方のマイクロチャンネル公衆数にしてください注意を払います[]