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是的,就是这样。