首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >合成的默认构造函数如何初始化已经初始化的类成员?

合成的默认构造函数如何初始化已经初始化的类成员?
EN

Stack Overflow用户
提问于 2020-08-10 19:27:43
回答 2查看 140关注 0票数 2

我正在学习课程,书中的C++ Primer第7.1.4章说:

编译器生成的构造函数称为合成的默认构造函数。对于大多数类,这个合成构造函数将类的每个数据成员初始化如下:

如果存在类内初始化器(§2.6.1,p. 73),则使用它初始化member.

  • Otherwise,默认初始化(§2.2.1,p. 43)成员.

如果类成员已经具有类内初始化器,为什么这个合成的默认构造函数会再次初始化它们?而且,我认为初始化只能发生一次。上述情况表明,成员被初始化两次,一次显式地初始化,一次由合成的默认构造函数隐式地初始化。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-10 19:32:51

在类中,初始化器实际上不会初始化任何内容。它们都是语法糖,如果没有提供,则使用此初始化程序。所以,用

代码语言:javascript
运行
复制
struct foo
{
    int a = 42;
    int b;
};

编译器将生成一个构造函数,如

代码语言:javascript
运行
复制
foo() : a(42)/*, b()*/ {}

因为a有一个“初始化器”,而b没有。注意,b()只是阐述而已。由于b是一个int,所以不会对其进行初始化。

在一个更复杂的构造函数中,如

代码语言:javascript
运行
复制
struct foo
{
    int a = 42;
    int b;
    foo() : b(21) {}
};

由于类成员初始化列表中缺少a成员,编译器将向列表中添加a(42),因为这是要使用的默认初始化程序。

如果你有

代码语言:javascript
运行
复制
struct foo
{
    int a = 42;
    int b;
    foo() : a(3), b(21) {}
};

然后忽略默认的初始化程序,a的值为3,而不是42

票数 4
EN

Stack Overflow用户

发布于 2020-08-10 19:32:58

再次初始化成员没有任何意义。如果存在类内初始化器,则合成的默认构造函数将使用它,这是该成员的第一次初始化。成员在调用构造函数之前不初始化,即使它们具有类内初始化器.

您可以理解类中的初始化器作为编译器的指令,在没有为其提供其他初始化的情况下如何构建构造函数。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63346772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档