gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:35:04 25 4
gpt4 key购买 nike

我正在学习类,C++ Primer 这本书的第 7.1.4 章说了以下内容:

The compiler-generated constructor is known as the synthesized defaultconstructor. For most classes, this synthesized constructorinitializes each data member of the class as follows:

  • If there is an in-class initializer (§ 2.6.1, p. 73), use it to initialize the member.
  • Otherwise, default-initialize (§ 2.2.1, p. 43) the member.

如果类成员已经有一个类内初始化器,为什么这个合成的默认构造函数要再次初始化它们?另外,我认为初始化是一件只能发生一次的事情。以上建议成员被初始化两次,一次显式初始化,一次由合成的默认构造函数隐式初始化。

最佳答案

在类中初始化器实际上并不初始化任何东西。如果没有提供,它们都是使用此初始化程序的语法糖。所以,与

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

关于c++ - 合成的默认构造函数如何初始化已经初始化的类成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63346772/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com