Есть ли преимущества или недостатки в явной настройке списка инициализации в конструкторе по умолчанию?

Есть ли какие-либо преимущества или недостатки в том, чтобы явно иметь полный список инициализации для ваших конструкторов объектов 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() {};

Благодарю.

3

Решение

() инициализатор вызывает инициализацию значения «без конструкторов» для объектов без определенного пользователем конструктора. Итак, для таких объектов наличие или отсутствие явного () Инициализатор в списке инициализатора конструктора имеет значение.

Аргументы могут быть сделаны для использования () инициализатор («приятно держать все как можно более инициализированным») и против него («избегать бесполезной фиктивной инициализации»).

Лично в тех случаях, когда поведение одинаково с или без () инициализатор, я бы избегал включения членов в список инициализатора конструктора. Более того, в случаях, когда поведение отличается, но у меня пока нет значимого инициализатора для конкретного члена, я предпочитаю оставлять его неинициализированным (вместо вызова инициализации значения).

7

Другие решения

Недостаток

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;
}

Представьте себе создание экземпляра класса А. Этот объект не будет содержать значения для b1. Несмотря на это, вы все равно сможете вызывать tellClassBName () перед вызовом initMembers (), что приведет к ошибкам.

Кажется, это не здорово без хорошей документации, работая в команде.

0

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