C++ 显式声明会在默认构造函数中触发警告
C++ Explicit declaration triggers a warning in the default constructor
在Code::Blocks v13.12
项目中,我有一个名为Drawable
的类,它有一个名为rotation
的浮点成员变量。
我注意到在Drawable
的默认构造函数中显式声明rotation
会触发以下警告:
'Drawable::rotation' 应该在成员初始化列表中初始化 [-Weffc++]
但是,在其定义旁边显式声明rotation
并不能做到这一点。
我想知道的是,为什么这样做:
Drawable() {
rotation = 0.f;
}
给我一个成员初始化警告,而这个:
class Drawable
{
...
float rotation = 0.f;
...
}
而这个:
Drawable() : rotation(0.f) {}
毫无怨言地编译?
-Weffc++ 警告描述如下:
警告违反 Scott 的以下样式准则 迈耶斯的有效C++系列书籍:
- 为具有动态分配内存的类定义复制构造函数和赋值运算符。
- 首选初始化而不是构造函数中的赋值。
- 让运算符 = 返回对 *this 的引用。
- 当必须返回对象时,不要尝试返回引用。
- 区分递增运算符和递减运算符的前缀和后缀形式。
- 切勿重载 &&、||或 ,。
您看到的警告在第 4 项中介绍:确保对象在初始化之前它们用于有效C++第 3 版,其中说(释义):
C++规则规定对象的数据成员是 在输入构造函数的主体之前初始化。
和:
编写 [...] 构造函数的更好方法是使用成员 初始化列表而不是赋值 [...] 构造函数产生 相同的最终结果[...],但它通常会更有效率。
和(强调我的措辞):
基于赋值的版本首先将默认构造函数称为 初始化成员变量,然后及时分配 默认构造值之上的新值。所有的工作 因此,在这些默认结构中执行的被浪费了。这 成员初始化列表方法避免了这个问题,
在类的 C++11 中,成员初始值设定项(也可以避免此警告)可以简化初始化,如果大多数成员变量都有默认值,一个缺点是直到 C++14 这使您的类成为非聚合。
相关文章:
- 构造函数中的 C4267 转换警告 - 无法修复过载?
- 当没有显式关键字与单参数构造函数一起使用时,编译器可以发出警告
- 当我尝试从成员函数调用构造函数时,为什么IDE会发出警告
- 带有C 11继承的构造函数的警告
- 警告:用两个参数构造函数返回对象时,表达结果未使用
- 警告C26495函数调用从构造函数到初始化变量,原因
- 为什么 GCC 在使用继承的构造函数时警告我无用的强制转换
- 在使用复制构造函数和赋值时生成警告
- 为什么 g++ 不发出这个与构造函数相关的 noexcept 启用"-fpic"的警告?
- 警告:基类应在复制构造函数中显式初始化
- 实现 C++11 委派构造函数功能会导致多个警告
- C++ 显式声明会在默认构造函数中触发警告
- 扩展具有私有构造函数和析构函数的单例类会给出编译时警告
- GCC:缺少关于构造函数中初始化顺序的警告
- 警告:基类“A”应在复制构造函数中显式初始化
- 关于在构造函数中将临时绑定到引用成员的虚假警告
- 使用 g++ 编译C++时,"隐藏构造函数"警告是什么意思?
- 类和构造函数C++ - 错误和警告 C2146, C4430
- clang中如何处理全局构造函数警告
- 派生构造函数警告:永远不会被执行