类内定义是否违反了ODR规则?
Bjarne Stroustrup的解释如下:
类通常在头文件中声明,头文件通常包含在许多翻译单元中。然而,为了避免复杂的链接器规则,c++要求每个对象都有一个唯一的定义。如果c++允许在类中定义需要作为对象存储在内存中的实体,那么该规则将被打破。
class foo
{
float f = 1.1f;
int i = 1;
string s = "foo";
long long ll = 44ll;
};
这是成员的实际定义吗?这是否违反了ODR规则?如果不是,那么与通过构造函数初始化相比,这样做的优势是什么?
类内定义是否违反ODR规则?
您所演示的不是"定义"。它是默认的成员初始化器。在初始化类的实例时,如果没有为非静态数据成员提供默认初始化器,则使用此默认初始化器。
示例没有违反ODR。
从技术上讲,标准没有提到如何定义非静态数据成员。然而,它们似乎并没有被排除在"特殊用途"之外。这可能是标准措辞上的缺陷。子对象并不需要定义。
在类初始化中帮助我们设置默认状态成员的(这反过来又让我们设置对象作为一个整体的默认状态)。例如,如果你希望给定类的任何对象都有默认值(state),那么你应该使用类内初始化。
使用类内初始化还有一个原因。如果你不为内置类型提供类内初始化器,那么它们将具有垃圾值。也就是说,不能对该数据成员的值做任何说明,因为这不是我们想要的值。
这就是为什么它总是建议你应该初始化非静态数据成员类型。建成的