3

初期化リストのメンバー変数の後に括弧を入れる人を見てきました。なぜ人々はそれをするのだろうか?

たとえば、ヘッダー ファイルに STL コンテナーがあります。

class A{
public: 
    A();
    ...
private: 
    vector<string> v;
}

そしてソースファイルで:

A::A() : v() {}

私の質問は、 v() とは何か、そして v が値に初期化されているように見えないので、なぜ人々はそうするのですか?

4

2 に答える 2

5

これにより、メンバーのデフォルトのコンストラクターまたは初期化子 (プレーン型の場合) が実行されます。このコンテキストでは、デフォルトでベクターが作成されます。これはデフォルトのコンストラクターであるため、ここでは必要ありません。v初期化子がない場合、デフォルトで構築されていたでしょう。


class Example {

private:
    int defaultInt;
    vector<int> defaultVector;
    int valuedInt;
    vector<int> sizedVector;

public:

    Example(int value = 0, size_t vectorLen = 10) 
        : defaultInt(), defaultVector(), valuedInt(value), sizedVector(vectorLen)
    {
        //defaultInt is now 0 (since integral types are default-initialized to 0)
        //defaultVector is now a std::vector<int>() (a default constructed vector)
        //valuedInt is now value since it was initialized to value
        //sizedVector is now a vector of 'size' default-intialized ints (so 'size' 0's)
    }

};

キックとクスクスの場合、値を持つ with要素thirdVector(vectorLen, value)を取得することもできます。(したがって、要素のベクトルの値は になります。)vectorvectorLenvalueExample(5, 10)thirdVector105

于 2013-02-19T20:11:25.510 に答える
2

My question is what is v() and why do people do that since that doesn't look like v is initialized into a value either

これは、より明確にするために行われることがあります。非 POD タイプの場合、デフォルトのコンストラクターが自動的に呼び出されるため、これは必要ありません。型の既定のコンストラクターが定義されていないか、アクセスできない場合、コンパイル エラーが発生します。

初期化されていない場合、値は未定義であるため、これは POD タイプに最も適しています。

struct A
{
    int  t;
    A() : { /* value of t undefined */ }
}

struct A
{
    int  t;
    A() : t() { /* value of t is t's default value of 0 */ }
}
于 2013-02-19T20:32:31.737 に答える