Я видел, как люди ставили круглые скобки после переменной-члена в списке инициализации. Интересно, почему люди так делают?
Например, у меня есть контейнер 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)
}
};
Для ударов и хихиканья, вы также можете сделать 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 */ }
}