3

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

例子:

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. 第一个构造函数的初始化列表分配pOtherClassNULL.

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

4

1 回答 1

5

根据 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)
{
}
于 2014-02-19T16:42:27.927 回答