Почему конструктор по умолчанию для C ++, созданный компилятором, «плохой»? - PullRequest
0 голосов
/ 24 мая 2011

Может кто-нибудь объяснить, что означает следующее ?

Вы должны определить конструктор по умолчанию, если ваш класс определяет переменные-члены и не имеет других конструкторов. В противном случае компилятор сделает это за вас, плохо.

Что они называют "плохо"?

Ответы [ 11 ]

5 голосов
/ 24 мая 2011

Может указывать на то, как new T и new T() различаются, если не предоставлен ctor .

5 голосов
/ 24 мая 2011

Из раскрытия этой ссылки:

"Причина в том, что если у вас нет других конструкторов и вы не определяете конструктор по умолчанию, компилятор сгенерирует его для вас. Этот компиляторсгенерированный конструктор не может правильно инициализировать ваш объект. "

1 голос
/ 24 мая 2011

Возьмите руководство по стилю Google с небольшим количеством соли - или, может быть, грузовик с солью.

Это правда, что сгенерированный компилятором конструктор по умолчанию не обязательно будет инициализировать элементы, имеющие встроенные типы, осмысленным образом. Если вы хотите, чтобы это было сделано, то да, его неудача сделать это плохо. OTOH, если вы не хотите, чтобы это было сделано, то это может быть несколько плохо (расточительно).

Итог: бывают времена, когда вы пишете свой собственный ctor по умолчанию, но они стремятся к исключению, а не к правилу. Несмотря на то, что существуют простые практические правила, охватывающие множество случаев в C ++, и они предотвратят множество проблем, на самом деле это не одна из них - здесь вы в значительной степени do должны знать, что такое компилятор сгенерированный ctor будет делать то, что вы хотите по-другому, если вы собираетесь написать свой собственный.

1 голос
/ 24 мая 2011

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

1 голос
/ 24 мая 2011

Хорошо быть уверенным, что объект создан в известном состоянии. Примитивные переменные не будут установлены в ноль по умолчанию, поэтому вы можете получить тонкие ошибки, которые не всегда появляются. Инициализируя переменные-члены в разумные переменные, все становится гораздо более предсказуемым.

0 голосов
/ 24 мая 2011

Это просто слишком упрощенная версия правил 3, вы должны либо определить себя, либо оставить версию компилятора

  • конструктор копирования
  • оператор присваивания
  • деструктор

(обратите внимание, что, определяя себя как конструктор копирования, компилятор не будет определять конструктор по умолчанию).

0 голосов
/ 24 мая 2011

Он не будет устанавливать целые числа в 0 или указатели на ноль. Он будет запускать конструкторы по умолчанию для объектов типов с конструкторами.

Некоторые люди назвали бы это «неразумным».

0 голосов
/ 24 мая 2011

Если у вас есть примитивные типы в качестве переменных-членов (например, int, float), то ctor по умолчанию не будет их инициализировать. Переменные-члены, являющиеся типом класса, будут вызываться из ctor по умолчанию.

Предпочитать списки инициализаторов членов, поэтому ваш пользовательский ctor может быть пустым:

class Foo {
 int bar;
 float baz;

 Foo(): bar(0), baz(0.0f) { /* empty ctor body */ }

};
0 голосов
/ 24 мая 2011

На самом деле, это руководство, чтобы убедиться, что люди точно делают заявление о том, что является недопустимым состоянием или состоянием по умолчанию для любого объекта.

Таким образом, нет ничего удивительного при чтении кода по сравнению с фактическим выполнением.

Однако, подумайте, что это руководство компании, которое используется для того, чтобы убедиться, что все соблюдают одни и те же правила, это не то, что вы должны следовать, потому что Google делает это.

На самом деле, если вам удастся сделать все ваши объекты-члены находящимися в допустимом состоянии при создании по умолчанию или вынудить вас установить конструктор, то для такого руководства нет веских оснований.

0 голосов
/ 24 мая 2011

В сборке Debug большинство компиляторов заполняют неинициализированное пространство некоторыми магическими значениями, чтобы отладка была надежной. А предоставление собственного конструктора предотвращает некоторые оптимизации POD.

...