Почленная инициализация

Возможный дубликат:
списки инициализации C++

В чем разница между инициализацией по члену и прямой инициализацией в классе? В чем разница между двумя конструкторами, определенными в классе?

class A
{
    public:
    int x;
    int y;
    A(int a, int b) : x(a), y(b)
    {}

    A(int a, int b)
    {
        x = a;
        y = b;
    }
};

person cppcoder    schedule 13.07.2011    source источник


Ответы (2)


Теоретические ответы были даны другими участниками.

Прагматически в этих случаях используется инициализация по элементам:

  • В вашем классе есть ссылочный атрибут (MyClass & mMyClass). Вам нужно выполнить инициализацию по члену, иначе он не скомпилируется.
  • В вашем классе есть постоянный атрибут (const MyClass mMyClass). Вам также необходимо выполнить инициализацию по элементам, иначе он не скомпилируется.
  • В вашем классе есть атрибут без конструктора по умолчанию (MyClass mMyClass без конструктора MyClass::MyClass()). Вам также необходимо выполнить инициализацию по элементам, иначе он не скомпилируется.
  • У вас есть объект чудовищно большой атрибут (MyClass mMyClass и sizeof(MyClass) = 1000000000). При инициализации по элементам вы создаете ее только один раз. При прямой инициализации в конструкторе он строится дважды.
person B. Decoster    schedule 13.07.2011
comment
Это был тот ответ, который я искал. - person cppcoder; 13.07.2011

Первый использует инициализацию, а второй НЕ использует инициализацию, он использует присваивание. Во втором случае элементы x и y сначала инициализируются по умолчанию (с нулем), а затем им назначаются a и b соответственно.

Также обратите внимание, что во втором случае элементы инициализируются по умолчанию только если типы членов имеют нетривиальный конструктор по умолчанию. В противном случае инициализация невозможна (как отметил @James в комментарии).

Теперь посмотрите эту тему, чтобы знать:

person Nawaz    schedule 13.07.2011
comment
+1. Хотя для членов int эффект тот же. - person Nemo; 13.07.2011
comment
Во втором есть только инициализация по умолчанию для типов с нетривиальным конструктором по умолчанию. В противном случае инициализация невозможна. - person James Kanze; 13.07.2011
comment
@James: В этом примере типы x и y равны int, следовательно, его инициализация по умолчанию. Но ваш комментарий делает его более полным. Позвольте мне добавить это к моему ответу. - person Nawaz; 13.07.2011
comment
@Nawaz В этом примере используются типы int, то есть POD, поэтому инициализация отсутствует. (Но вы правильно поняли в модификации вашего ответа.) - person James Kanze; 14.07.2011