带初始化列表的 C++ 委托构造函数。发生了哪些初始化?

tur*_*too 3 c++ constructor class definition delegating-constructor

我看过一个非常相似的问题,但我不太确定我理解答案。如果我委托构造函数,会发生初始化列表中的哪些初始化?

例子:

MyClass::MyClass(int a, int b)
:
MyClass(a, b, NULL),
int1(a),
int2(b),
pOtherClass(NULL)
{
}

MyClass::MyClass(int a, int b, Other *p)
:
int1(a),
int2(b),
pOtherClass(p)
{
     if (pOtherClass == NULL)
     {
         pOtherClass = &DefaultInstance;
     }
}
Run Code Online (Sandbox Code Playgroud)

由于编译器设置,我必须拥有两个类的完整初始值设定项列表。但我想要的是:

  1. 第一个构造函数( int, int) 调用第二个构造函数( int, int, Other *)
  2. 第二个构造函数分配一个默认地址pOtherClass
  3. 第一个构造函数的初始化列表分配pOtherClassNULL.

我在顶部链接的问题似乎表明这种行为不会发生,但是 ( ) 构造函数中的初始化列表有什么意义呢int, int?只是为了让编译器高兴吗?

Vla*_*cow 5

根据C++标准

\n\n
\n

如果 mem-initializer-id 指定构造函数\xe2\x80\x99s 类,则它应是唯一的 mem-initializer;构造函数是委托构造函数,由 mem-initializer 选择的构造函数是目标构造函数。主构造函数是在对象构造过程中调用的第一个构造函数(即,不是该对象构造的目标构造函数)。目标构造函数由重载决策选择。一旦目标构造函数返回,\n 就会执行委托构造函数的主体。如果构造函数直接或间接委托给自身,则程序格式错误;不需要任何诊断。

\n
\n\n

所以这个构造函数定义

\n\n
MyClass::MyClass(int a, int b)\n:\nMyClass(a, b, NULL),\nint1(a),\nint2(b),\npOtherClass(NULL)\n{\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

是无效的。

\n\n

必须是

\n\n
MyClass::MyClass(int a, int b)\n:\nMyClass(a, b, NULL)\n{\n}\n
Run Code Online (Sandbox Code Playgroud)\n