Объект типа класса может быть инициализирован заключенным в круглые скобки expression-list, где expression-list конструируется как список аргументов для конструктора, который вызывается для инициализации объекта. В качестве альтернативы, single assignment-expression может быть указан как initializer using = форма инициализации. Применяется либо семантика прямой инициализации, либо семантика копирования-инициализации; см [dcl.init]. [ Example:
struct complex { complex(); complex(double); complex(double,double); }; complex sqrt(complex,complex); complex a(1); // initialize by a call of complex(double) complex b = a; // initialize by a copy of a complex c = complex(1,2); // construct complex(1,2) using complex(double,double), // copy/move it into c complex d = sqrt(b,c); // call sqrt(complex,complex) and copy/move the result into d complex e; // initialize by a call of complex() complex f = 3; // construct complex(3) using complex(double), copy/move it into f complex g = { 1, 2 }; // initialize by a call of complex(double, double)
— end example ] [ не влияет на инициализацию. ] Note: Overloading of the assignment operator — end note
Объект типа класса также может быть инициализирован файлом braced-init-list. Применяется семантика инициализации списка; видеть [dcl.init] и [dcl.init.list]. [ Example:
complex v[6] = { 1, complex(1,2), complex(), 2 };
Здесь complex::complex(double) вызывается для инициализации v[0] и v[3], complex::complex(double, double) вызывается для инициализации v[1], complex::complex() вызывается для инициализации v[2], v[4]и v[5]. Другой пример:
struct X { int i; float f; complex c; } x = { 99, 88.8, 77.7 };
Здесь x.i инициализируется 99, x.f 88,8 и complex::complex(double) вызывается для инициализации x.c. ] [ Фигурные скобки можно опустить в любом агрегате, даже если у агрегата есть члены типа класса с определяемыми пользователем преобразованиями типов; см . ] — end example Note: initializer-list [dcl.init.aggr] — end note
[ Note: Если T это тип класса без конструктора по умолчанию, любое объявление объекта типа T (или его массива) неправильно сформировано, если не initializer указано явно (см. [class.init] И [dcl.init]). ] — end note
[ Порядок, в котором инициализируются объекты со статической продолжительностью хранения или хранением потоков, описан в и . ] Note: [basic.start.dynamic] [stmt.dcl] — end note