Справочное руководство по C++

R.12.6.1 Явная инициализация.

Объекты классов с конструкторами (§R.12.1) можно инициализировать списком выражений, заключенным в скобки. Этот список считается списком фактических параметров для вызова конструктора, производящего инициализацию. Иначе, в качестве инициализатора задается с помощью операции = одно значение. Оно используется как фактический параметр для конструктора копирования. Обычно можно обойтись без вызова конструктора копирования, например:

Class complex {

 //…

Public:

 complex();

 complex(double);

 complex(double,double);

 //…

};

Complex sqrt(complex,complex);

Complex a(1); // инициализация вызовом.

  // complex(double).

Complex b = a; // инициализация копированием `a'.

Complex c = complex(1,2); // конструктор complex(1,2).

  // вызывается complex(double,double).

  // и копируется в `c'.

Complex d = sqrt(b,c); // вызывается sqrt(complex,complex),

  // результат копируется в `d'.

Complex e; // инициализация вызовом конструктора.

Complex f = 3; // complex(3), вызывается.

  // complex(double) и результат.

  // копируется в `f'.

Перегрузка операции присваивания = не оказывает влияние на инициализацию.

Инициализация, происходящая при передаче фактических параметров и при возврате из функции, эквивалентна инициализации вида.

T x = a;

Инициализация, происходящая в выражении операции new (§R.5.3.3) и при инициализации базовых классов и членов, эквивалентна инициализации вида.

T x(a);

Для массивов объектов класса с конструкторами используются при инициализации (§R.12.1) конструкторы как и для одиночных объектов. Если оказалось, что инициализаторов в списке меньше, чем элементов массива, используется стандартный конструктор (§R.12.1). Если его нет, список инициализаторов должен быть полным. Приведем пример:

Complex cc = { 1, 2 }; // ошибка: необходимо.

  // использовать конструктор.

Complex v[6] = { 1,complex(1,2),complex(),2 };

Здесь v[0] и v[3] инициализируются значением complex::complex(double), v[1] инициализируется complex::complex(double,double), а v[2], v[4] и v[5] инициализированы complex::complex().

Объект класса M может быть членом класса X в одном из следующих случаев:

(1) M не имеет конструктора;

(2) M имеет стандартный конструктор;

(3) X имеет конструктор и каждый из них задает инициализатор-ctor (§R.12.6.2) для члена M.

В случае 2 при создании составного объекта вызывается стандартный конструктор. Если член составного объекта имеет деструктор, то он вызывается при уничтожении составного объекта.

Конструкторы для нелокальных статических объектов вызываются в том порядке, в каком они идут в тексте программы, деструкторы вызываются в обратном порядке, см. также §R.3.4, §R.6.7, §R.9.4.