В Code::Blocks v13.12
Проект у меня есть класс под названием Drawable
которая имеет переменную-член с плавающей точкой под названием rotation
,
Я заметил, что явно декларирует rotation
внутри Drawable
конструктор по умолчанию вызовет следующее предупреждение:
‘Drawable :: вращение’ должно быть инициализировано в списке инициализации члена [-Weffc ++]
Тем не менее, явно декларируя rotation
наряду с его определением не делает этого.
Я хочу знать, почему это так:
Drawable() {
rotation = 0.f;
}
Дайте мне предупреждение об инициализации члена, пока это:
class Drawable
{
...
float rotation = 0.f;
...
}
И это:
Drawable() : rotation(0.f) {}
Компилировать без жалоб?
-Weffc ++ предупреждение описаны следующим образом:
Предупреждать о нарушениях следующих руководств по стилю от Скотта
Серия книг Meyers Effective C ++:
- Определите конструктор копирования и оператор присваивания для классов с динамически выделяемой памятью.
- Предпочитаю инициализацию присваиванию в конструкторах.
- У оператора = вернуть ссылку на * это.
- Не пытайтесь вернуть ссылку, когда вы должны вернуть объект.
- Различают префиксную и постфиксную формы операторов увеличения и уменьшения.
- Никогда не перегружайте &&, ||, или,.
Предупреждение, которое вы видите, описано в пункте 4: Убедитесь, что объекты инициализированы до
они используются из Эффективное C ++ 3-е издание который говорит (изложить):
Правила C ++ предусматривают, что члены-данные объекта
инициализируется перед вводом тела конструктора.
а также:
Лучший способ написать конструктор […] — использовать член
список инициализации вместо присваивания […] конструктор дает
тот же конечный результат […], но он часто будет более эффективным.
а также (акцент моя формулировка):
Версия на основе присвоения сначала вызывала конструкторы по умолчанию для
инициализировать переменные-члены затем быстро назначен
новые значения поверх построенных по умолчанию. Все работы
поэтому выполнение этих конструкций по умолчанию было потрачено впустую.
подход списка членов инициализации позволяет избежать этой проблемы,
В С ++ 11 в инициализаторах членов класса (который также избегает этого предупреждения) может упростить инициализацию, если большинство ваших переменных-членов имеют значения по умолчанию, одним недостатком является то, что до C ++ 14 это сделать ваш класс неагрегированным.