C++使用初始化列表委派构造函数.哪个初始化发生

C++ delegating constructor with initialization list. Which inits happen?

本文关键字:初始化 构造函数 委派 列表 C++      更新时间:2023-10-16

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

例:

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;
     }
}

由于编译器设置,在这里我必须为这两个类提供完整的初始值设定项列表。但我想要的是:

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

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

根据C++标准

如果 mem-initializer-id 指定构造函数的类,则它应该是 唯一的内存初始值设定项;构造函数是委托构造函数, 并且 mem 初始值设定项选择的构造函数是目标 构造 函数。主构造函数是第一个构造函数 在构造对象(即不是目标)时调用 该对象构造的构造函数)。目标构造函数是 通过重载分辨率选择。一旦目标构造函数返回, 执行委托构造函数的主体。如果构造函数 直接或间接地委托给自己,程序格式不正确; 无需诊断。

所以这个构造函数定义

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

无效。

必须是

MyClass::MyClass(int a, int b)
:
MyClass(a, b, NULL)
{
}