инициализация — явное объявление C ++ вызывает предупреждение в конструкторе по умолчанию

В 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) {}

Компилировать без жалоб?

2

Решение

-Weffc ++ предупреждение описаны следующим образом:

Предупреждать о нарушениях следующих руководств по стилю от Скотта
Серия книг Meyers Effective C ++:

  • Определите конструктор копирования и оператор присваивания для классов с динамически выделяемой памятью.
  • Предпочитаю инициализацию присваиванию в конструкторах.
  • У оператора = вернуть ссылку на * это.
  • Не пытайтесь вернуть ссылку, когда вы должны вернуть объект.
  • Различают префиксную и постфиксную формы операторов увеличения и уменьшения.
  • Никогда не перегружайте &&, ||, или,.

Предупреждение, которое вы видите, описано в пункте 4: Убедитесь, что объекты инициализированы до
они используются
из Эффективное C ++ 3-е издание который говорит (изложить):

Правила C ++ предусматривают, что члены-данные объекта
инициализируется перед вводом тела конструктора.

а также:

Лучший способ написать конструктор […] — использовать член
список инициализации вместо присваивания […] конструктор дает
тот же конечный результат […], но он часто будет более эффективным.

а также (акцент моя формулировка):

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

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

4

Другие решения


По вопросам рекламы [email protected]