C++11 带赋值的成员声明与CTOR有何关系?
抱歉-我肯定我找不到任何答案,因为我不知道名称C++11 带赋值的成员声明与CTOR有何关系?,c++11,constructor,C++11,Constructor,抱歉-我肯定我找不到任何答案,因为我不知道名称 class Foo { public: Foo() { } // default ctor explicit Foo(int a) : _a(a) { } // semi-explicit - but what is _b's value?? protected: int _a = 9; // HOW DOES THIS RELATE TO EACH OF THE CTORS?! int _b = 3; // HOW D
class Foo
{
public:
Foo() { } // default ctor
explicit Foo(int a) : _a(a) { } // semi-explicit - but what is _b's value??
protected:
int _a = 9; // HOW DOES THIS RELATE TO EACH OF THE CTORS?!
int _b = 3; // HOW DOES THIS RELATE TO EACH OF THE CTORS?!
};
通过显式指定默认的构造函数而不指定_a或_b,声明的赋值是发生(_a=9,_b=3)还是只有在我没有创建默认的构造函数(或者我声明为Foo()=default;)时才会发生?C++11[class.base.init]/8: 在非委托构造函数中,如果给定的非静态数据成员或基类未由mem初始值设定项id指定(包括由于构造函数没有ctor初始值设定项而没有mem初始值设定项列表的情况),并且实体不是抽象类的虚拟基类(10.4),则 -如果实体是具有大括号或相等初始值设定项的非静态数据成员,则按照8.5中的规定初始化实体 -
因此,在您的情况下,默认初始化的
Foo
具有\u a==9
和\u b==3
,因为\u a
或\u b
都不会出现在(缺少的)mem初始值设定项列表中Foo(7)
将有\u a==7
和\u b==3
,因为\u b
不会出现在mem初始值设定项列表中。谢谢-修复了:PSo,基本上,除非在成员初始值设定项列表中有显式初始化,否则使用给定的大括号或相等的初始值设定项?这听起来像是我在世界上最好的地方想要的,谢谢。@Mordachai是的,就是这样。