Список инициализации конструктора для типов элементов POD с использованием () [duplicate]

0

Ниже приведен пример кода, который я приготовил, чтобы ответить на мой вопрос:

class test {
    public:
        test(int x, int y) :  _x(x), _y() {}

    private:
        int _x, _y;
};

Для POD (простые типы данных) имеет значение _y() (пустая скобка)? Если да, то что инициализируется? Если эффект неэффективен, то он неэффективен, если в списке есть _y().

Спасибо, Ахмед.

  • 0
    как правило, не используйте начальные подчеркивания , потому что это соглашение, используемое реализациями Си. используйте завершающие подчеркивания (общее соглашение C ++) или другое соглашение. в большинстве случаев нет никакого вреда, например, для именования аргументов , но это хорошая идея, чтобы держаться подальше от того, что может причинить вред в целом, когда нет веских причин для этого.
Теги:
c++11

2 ответа

2
Лучший ответ

Списки инициализации конструктора выполняют прямую инициализацию (С++ 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, поэтому они заканчиваются нулевым инициализацией.

  • 1
    это хорошо с цитатами, но вы забыли предоставить ссылки на эти цитаты. я знаю откуда они широкая читательская аудитория, вероятно, этого не делает (и может даже не осознавать, что это цитаты).
  • 0
    @ Cheersandhth.-Alf Я продолжаю забывать об этом. Благодарю.
3

Инициализатор элемента _y() имеет значение инициализации значения и инициализирует _y до нуля.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню