Ниже приведен пример кода, который я приготовил, чтобы ответить на мой вопрос:
class test {
public:
test(int x, int y) : _x(x), _y() {}
private:
int _x, _y;
};
Для POD (простые типы данных) имеет значение _y()
(пустая скобка)? Если да, то что инициализируется? Если эффект неэффективен, то он неэффективен, если в списке есть _y()
.
Спасибо, Ахмед.
Списки инициализации конструктора выполняют прямую инициализацию (С++ 11 §12.6.2/7):
Список выражений или список бит-init в mem-initializer используется для инициализации указанного подобъекта... согласно правилам инициализации 8.5 для прямой инициализации.
В правилах инициализации указано значение ()
для инициализации объекта (§8.5/16):
Если инициализатор is(), объект инициализируется значением.
Для инициализации значения типа POD следует инициализировать его нулевой инициализацией, что означает, что для его значения или значений его подобъектов значение 0 (§8.5/5):
Для инициализации объекта типа T означает:
если T является (возможно, cv-квалифицированным) классом типа (раздел 9) с предоставленным пользователем конструктором (12.1), [... не POD]
если T является (возможно, cv-квалифицированным) классом типа non-union без конструктора, предоставленного пользователем, тогда объект инициализируется нулем и, если Ts неявно объявленный конструктор по умолчанию является нетривиальным, [... не POD ]
если T - тип массива, то каждый элемент инициализируется значением;
в противном случае объект инициализируется нулем.
В случае типа массива это только тип POD, если его элементы являются типами POD, поэтому они заканчиваются нулевым инициализацией.
Инициализатор элемента _y()
имеет значение инициализации значения и инициализирует _y
до нуля.