4

C ++オブジェクトコンストラクターの完全な初期化リストを明示的に持つことの長所または短所はありますか?(デフォルトのコンストラクターを使用している場合でも、すべてのメンバーがリストされているように完全ですか?)

たとえば、オブジェクトがある場合:

class MyObject
{
    public: 
        MyObject();
    private:
        double _doub;
        Foo _foo;
        std::set<int> _intSet;
        int _int;
        Bar _bar;
}

コンストラクターを次のようにすることとの違いはありますか?

MyObject::MyObject():
    _doub(1.4), _foo("me"), _intSet(),
    _int(5), _bar() {};

特にデータを設定する必要がある(またはデフォルト以外のコンストラクターを呼び出す)必要があるオブジェクトのみをリストするのではなく、次のようになります。

MyObject::MyObject():
    _doub(1.4), _foo("me"), _int(5) {};

クラスにデフォルトのコンストラクターを使用するオブジェクトしかない場合、初期化リストを設定する必要がありますか?

例えば:

class MyObject
{
    public: 
        MyObject();

    private:
        Foo _foo;
        std::set<int> _intSet;
        Bar _bar;
}

このようにコンストラクターを持つ意味はありますか?

MyObject::MyObject():
    _foo(), _intSet(), _bar() {};

ありがとう。

4

2 に答える 2

7

()初期化子は、ユーザー定義のコンストラクターを持たないオブジェクトに対して、「コンストラクターなし」の値の初期化を呼び出します。()したがって、そのようなオブジェクトの場合、コンストラクター初期化子リストに明示的な初期化子が存在するかどうかによって違いが生じます。

イニシャライザを使用するための引数()(「すべてを可能な限り初期化したままにしておくと便利です」) と、それに対する引数 (「無駄なダミーの初期化を避ける」) を作成できます。

個人的には、()初期化子の有無にかかわらず動作が同じ場合、メンバーをコンストラクターの初期化子リストに含めることは避けます。さらに、動作が異なる場合でも、特定のメンバーに対して意味のある初期化子がまだない場合は、(値の初期化を呼び出す代わりに) 初期化しないままにしておくことを好みます。

于 2013-01-04T20:52:51.747 に答える
0

不利益

class A {
public:
     A(); //Where A does not initialize members
     void initMembers(); //A function that initalizes everything
     void tellClassBName(); //Writes a line in the console with the name of b1
private:
     B b1;
     int aNumber;
}

クラスAのインスタンスを作成することを想像してください。このオブジェクトはb1の値を保持しません。それにもかかわらず、initMembers()を呼び出す前に、tellClassBName()を呼び出すことができるため、エラーが発生します。

チームとして作業している間、優れたドキュメントがなければそれほど素晴らしいとは思えません。

于 2013-01-04T20:56:37.160 に答える