89

クラスのヘッダーファイルでクラスメンバーのデフォルト値を設定するC++11コードを作成する場合、それは良い習慣ですか?

それとも、クラスのコンストラクターでこれを行う方が良いですか?

編集:

つまり:

foo.h

#include <string>

using std::string;

class Foo{
    private:
        string greet = "hello";
    public:
        Foo();
};

VS

foo.cpp(もちろん、必要なヘッダーファイルはありますが、クラス内の初期化はありません):

Foo::Foo(){
    greet = "hello";
}

どちらが優れているのか、そしてその理由は?

4

3 に答える 3

105

クラスメンバーが常に同じ初期値で初期化される場合は、重複を避けるために、初期化子をインラインにする必要があります。初期値がコンストラクターに依存する場合は、コンストラクター初期化子リストに入れます。(そして、あなたがしたように割り当てを決して使用しないでください。)

例:

class Foo
{
    bool done = false;   // always start like this
    int qty;
    Bar * p;

public:
    Foo()                        : qty(0),              p(nullptr)    { }
    Foo(int q, Bar * bp)         : qty(q),              p(bp)         { }
    explicit Foo(char const * s) : qty(std::strlen(s)), p(new Bar(s)) { }

    // ...
};

この架空の例では、メンバーdoneは常にとして開始する必要がfalseあるため、初期化子をインラインで記述するのが最適です。他の2つのメンバー、qtyおよびpは、3つの異なるコンストラクターのそれぞれで異なる方法で初期化できるため、コンストラクターの初期化子リスト内で初期化されます。

骨董品:インライン初期化子を提供すると、クラスが簡単なデフォルトコンストラクターを持つことができなくなることに注意してください。

于 2012-07-21T18:48:55.133 に答える
13

古いC++コンパイラとの互換性を維持する必要があるかどうかによって異なります。C++11を使用していない場合は、コンストラクタでほとんどのメンバー(すべて非静的)を初期化する必要があります。さらに多くの人々は、これがデフォルトのctorを明示的に呼び出すことを意味する場合でも、すべてのメンバーを明示的に初期化することを提唱しています。通常、実装の詳細はヘッダーファイルではなくcppファイルに配置する必要があります。したがって、例は次のようになります。

Example:
//foo.h

class Foo{
public: 
  Foo();
private:
  std::vector<int> vect;
};

//foo.cpp

Foo::Foo():vect(){
}

C ++ 11では、より多くの選択肢があり、クラスメンバーの初期化子は、特に複数のcorがある場合に非常に便利になります。詳細については、次のリンクを参照してください: http: //www.stroustrup.com/C++11FAQ.html#member-init

編集後:コードによると、C++11を使用しています。私の知る限り、新しい可能性に関するグッドプラクティスに関する情報はほとんどありませんが、IMHO Inクラスのメンバー初期化子は、初期化を1つの場所に集中させるのに非常に便利であり、複雑さと入力を減らすことができます。

于 2012-07-21T18:36:41.437 に答える
4

ヘッダーで初期化することには、コードをよりローカルで理解しやすいものに保つという主な利点があります。タイピングも節約できます。

私の意見では、主な欠点は、コンストラクターにアクセスするためにより多くのヘッダーを含める必要があることです。単純な前方宣言では不十分であり、コンパイルに時間がかかります。

于 2012-07-21T18:50:55.370 に答える