список инициализации класса - PullRequest
1 голос
/ 07 января 2011

Просто простой вопрос о стиле кодирования c ++, например,

, все переменные-члены класса будут вызываться с конструктором по умолчанию в списке инициализации, если мы больше ничего не сделаем.Будет вызван конструктор B по умолчанию, и значение будет установлено равным 0, int ();

class A
{
   A();
private:
   B b;
   int value;
}

Однако мой вопрос, даже если будет вызываться конструктор по умолчанию, это хорошая привычка всегда делать это самостоятельноили он добавляет только дополнительные строки в код

A :: A (): b (), value () {}

Ответы [ 4 ]

4 голосов
/ 07 января 2011

Вы касаетесь одного из липких углов C ++.

Инициализация значений POD в объектах является липкой и зависит от нескольких вещей.
Даже я не уверен, что смогу понять все правила правильно, но я верю, что @Steve Jessop однажды написал статью о SO (хотя я могу ее найти).

Но некоторые примеры:

Этот класс всегда будет инициализирован b == false и значением = 0.

class A
{
   A() : b(), value() {}
   B b;
   int value;
};

Без явного конструктора по умолчанию это более сложно:
Здесь компилятор сгенерирует конструктор по умолчанию для вас. Но то, как сгенерированный компилятором конструктор по умолчанию работает, зависит от ситуации. Сгенерированный компилятором конструктор по умолчанию может выполнять две разные формы инициализации и зависит от контекста:

  1. Инициализация нуля (все члены POD обнуляются)
  2. Инициализация значения (все члены POD остаются неопределенными)

Пример: * * тысяча двадцать-восемь

class B
{
   B b;
   int value;
};

// Variables of static storage duration (notably globals)
// Will be zero initialized and thus b == false and value = 0

B   global; // Initialized

int main()
{
    // Object of automatic storage duration or dynamic storage duration
    // These will depend on how they are declared.

    // Value Initialization (POD re-mains undefined)
    B    bo1;           // b/value undefined
    B*   bp1 = new B;   // b.balue undefined

    // Zero Initialization
    B    bo2 = B();     // b = false, value = 0
    B*   bp2 = new B(); // b = false, value = 0

    // Note: The most obvious syntax for zero initializing a local object
    //        does not work as it is actually interpreted as a forward
    //        declaration of a function;
    B   bo3(); 
}
2 голосов
/ 07 января 2011

Хорошей идеей будет оставить конструктор по умолчанию. Сгенерированные компилятором конструкторы гораздо более надежны и удобны в обслуживании, чем написание собственных версий, и кроме всего прочего, это бесполезная трата времени на написание кода, который компилятор может написать для вас. Если вам не нужна строительная логика, не пишите конструктор.

Однако int не будет инициализирован, если вы не сделаете это, что является веской причиной для написания конструктора.

1 голос
/ 07 января 2011

Конструктор по умолчанию будет вызываться только для типов классов с конструкторами по умолчанию, но не для примитивов.

1 голос
/ 07 января 2011

По умолчанию переменные типа int не инициализируются со значением - вы должны сделать это самостоятельно.

Так что, если вы не установите переменную-член "value" в какое-либо значение в конструкторе, оно не будет инициализировано..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...