C ++使用初始化列表委托构造函数。哪个发生了?

时间:2014-02-19 16:27:48

标签: c++ constructor delegating-constructor

我看过a very similar question,但我不太清楚我理解答案。如果我委托一个构造函数,那么初始化列表中的初始化是什么?

示例:

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
  4. 我在顶部链接的问题似乎表明此行为不会,但那么(int, int)构造函数中初始化列表的重点是什么?只是为了让编译器满意吗?

1 个答案:

答案 0 :(得分:3)

根据C ++标准

  

如果mem-initializer-id指定构造函数的类,应该是   唯一的mem-initializer; 构造函数是委托构造函数,   并且mem-initializer选择的构造函数是目标   构造函数。主构造函数是第一个构造函数   在构造对象时调用(即不是目标   该对象构造的构造函数)。目标构造函数是   由重载决议选择。一旦目标构造函数返回,   委托构造函数的主体被执行。如果是构造函数   直接或间接地代表自己,该计划是不正确的;   无需诊断。

所以这个构造函数定义

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)
{
}