1. ホーム
  2. c++

[解決済み] メンバーデフォルト値ベストプラクティス

2023-04-06 10:51:45

質問内容

C++11 のコードを書くとき、クラスのヘッダー ファイルでクラス メンバのデフォルト値を設定するのはよい習慣ですか。

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

EDITです。

つまり

foo.h :

#include <string>

using std::string;

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

VS

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

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

どちらが良いのか、またその理由は?

どのように解決するのですか?

クラスメンバが常に同じ初期値で初期化される場合は、初期化子をインライン化し、重複を避けるようにします。初期値がコンストラクタに依存する場合は、コンストラクタのイニシャライザリストに記載します。(そして、決してあなたのような方法で代入を使わないでください。)

例です。

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つのメンバは qtyp は、3つの異なるコンストラクタでそれぞれ異なる初期化が可能なため、コンストラクタのイニシャライザリストの中で初期化されます。

珍妙な話です。インライン・イニシャライザを提供することで、クラスが 単純なデフォルトコンストラクタ .