给定代码:
struct Test {
int a = 1;
int b = 2;
};
Test test1;
Test test2{};
对于 test2
,我确定 test2.a == 1
且 test2.b == 2
。那么对于没有 {}
的 test1
,这个是否保证相同?
给定代码:
struct Test {
int a = 1;
int b = 2;
};
Test test1;
Test test2{};
对于 test2
,我确定 test2.a == 1
且 test2.b == 2
。那么对于没有 {}
的 test1
,这个是否保证相同?
Test test1;
等同于使用默认构造函数进行初始化,如果没有手动编写一个显示的初始化列表且没有将 Test() = deleted;
,那么会将两个成员变量设置为它们指定的初始值 1
和 2
。
“默认构造函数”是一种可以无需参数调用的构造函数,这恰好符合上述语句的情况。
您可以在标准文件中查阅有关默认构造函数的规则 - 转至§ 12.1第4节:
类X的默认构造函数是可以在没有参数的情况下调用的X类的构造函数...
并在第5节进一步说明:
当需要创建其类类型(1.8)的对象时使用默认值并未定义为删除的默认构造函数将自动定义为默认,即使未显式地声明该函数也是如此(3.2)...
是的,在这里它们有相同的效果。
对于第一种情况,它是使用默认初始化:
如果T是类类型,则考虑构造函数并针对空参数列表进行重载解析。选择的构造函数(其中之一是默认构造函数)被调用以为新对象提供初始值;
这意味着将调用隐式定义的默认构造函数; 它不使用任何成员初始化列表,然后默认成员初始化程序会生效来初始化数据成员。
对于第二种情况,它是聚合初始化:
如果初始化程序子句的数量小于成员和基类(自C++17以来)的数量,或初始化程序列表完全为空,则其余成员和基类(自C++17以来)通过其默认初始化程序进行初始化,如果在类定义中提供了该初始化程序,则会使用它们,否则(自C++14以来)...
因此, 默认成员初始化程序也会生效来初始化数据成员。
Test
不是一个聚合类型。) - songyuanyaotest1
也保证其成员a
被初始化为1
,其成员b
被初始化为2
。
The basic idea for C++11 is to allow a non-static data member to be initialized where it is declared (in its class). A constructor can then use the initializer when run-time initialization is needed. Consider:
class A { public: int a = 7; };
This is equivalent to:
class A { public: int a; A() : a(7) {} };
test1
不会被设置为1
和2
。 - YePhIcK