初期化リストのメンバー変数の後に括弧を入れる人を見てきました。なぜ人々はそれをするのだろうか?
たとえば、ヘッダー ファイルに STL コンテナーがあります。
class A{
public:
A();
...
private:
vector<string> v;
}
そしてソースファイルで:
A::A() : v() {}
私の質問は、 v() とは何か、そして v が値に初期化されているように見えないので、なぜ人々はそうするのですか?
初期化リストのメンバー変数の後に括弧を入れる人を見てきました。なぜ人々はそれをするのだろうか?
たとえば、ヘッダー ファイルに STL コンテナーがあります。
class A{
public:
A();
...
private:
vector<string> v;
}
そしてソースファイルで:
A::A() : v() {}
私の質問は、 v() とは何か、そして v が値に初期化されているように見えないので、なぜ人々はそうするのですか?
これにより、メンバーのデフォルトのコンストラクターまたは初期化子 (プレーン型の場合) が実行されます。このコンテキストでは、デフォルトでベクターが作成されます。これはデフォルトのコンストラクターであるため、ここでは必要ありません。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)
を取得することもできます。(したがって、要素のベクトルの値は になります。)vector
vectorLen
value
Example(5, 10)
thirdVector
10
5
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 */ }
}