class A
{
int a = 100;
};
和
class A
{
int a;
public :
A()
{
a = 100;
}
};
我知道有两种方法,因为静态变量在类外部初始化,并且无法在类中完成。但是如果我使用构造函数或在声明本身期间初始化变量a(一个普通的int),会有什么不同。
答案 0 :(得分:5)
根据CPP核心指南:http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rc-in-class-initializer
C.48:首选的成员初始值设定项的类初始值设定项 常量初始化器的构造函数
原因明确表示 预期在所有构造函数中使用相同的值。避免 重复。避免维护问题。它导致最短和 最有效的代码。
在您的确切示例中,差异并不是很大。但是随着类变得更加复杂,并且您添加了子类和多个构造函数,能够在一个位置定义默认值可以简化代码。
答案 1 :(得分:0)
在以下构造函数中:
class A { int a = 100; };
int a = 100;
是default member initializer。在进入构造函数之前,非静态数据成员按类定义中的声明顺序进行初始化。
如果在构造函数中指定了一个值,那么在赋值时,该变量已经初始化(作为POD,在这种情况下它被初始化为一个不确定的值):
A() { a = 100; }
因此,在这种情况下的区别在于,当在第二个示例中输入构造函数时,a
的值是不确定的,而在第一个示例中,它是初始化的。
第三种方法可以使用member initializer list:
A() : a{100}
{
}
在这种情况下,成员初始值设定项(如果有)将被忽略,但初始化序列仍将由类中声明的顺序决定。
与第一个示例一样,在启动构造函数之前,该值将初始化为100
。