Поставить скобки после переменной-члена для инициализации?

Я видел, как люди ставили круглые скобки после переменной-члена в списке инициализации. Интересно, почему люди так делают?

Например, у меня есть контейнер STL в заголовочном файле:

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

и в исходном файле:

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

У меня вопрос, что такое v () и почему люди делают это, так как это не похоже, что v тоже инициализируется значением

3

Решение

Это запустит конструктор или инициализатор по умолчанию (для простых типов) для члена. В этом контексте по умолчанию будет построен вектор. Поскольку это конструктор по умолчанию, он здесь не нужен. 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.)

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 */ }
}
2

По вопросам рекламы [email protected]