我正在学习课程,书中的C++ Primer第7.1.4章说:
编译器生成的构造函数称为合成的默认构造函数。对于大多数类,这个合成构造函数将类的每个数据成员初始化如下:
如果存在类内初始化器(§2.6.1,p. 73),则使用它初始化member.
如果类成员已经具有类内初始化器,为什么这个合成的默认构造函数会再次初始化它们?而且,我认为初始化只能发生一次。上述情况表明,成员被初始化两次,一次显式地初始化,一次由合成的默认构造函数隐式地初始化。
发布于 2020-08-10 19:32:51
在类中,初始化器实际上不会初始化任何内容。它们都是语法糖,如果没有提供,则使用此初始化程序。所以,用
struct foo
{
int a = 42;
int b;
};编译器将生成一个构造函数,如
foo() : a(42)/*, b()*/ {}因为a有一个“初始化器”,而b没有。注意,b()只是阐述而已。由于b是一个int,所以不会对其进行初始化。
在一个更复杂的构造函数中,如
struct foo
{
int a = 42;
int b;
foo() : b(21) {}
};由于类成员初始化列表中缺少a成员,编译器将向列表中添加a(42),因为这是要使用的默认初始化程序。
如果你有
struct foo
{
int a = 42;
int b;
foo() : a(3), b(21) {}
};然后忽略默认的初始化程序,a的值为3,而不是42。
发布于 2020-08-10 19:32:58
再次初始化成员没有任何意义。如果存在类内初始化器,则合成的默认构造函数将使用它,这是该成员的第一次初始化。成员在调用构造函数之前不初始化,即使它们具有类内初始化器.
您可以理解类中的初始化器作为编译器的指令,在没有为其提供其他初始化的情况下如何构建构造函数。
https://stackoverflow.com/questions/63346772
复制相似问题