【问题标题】:C++ delegating constructor with initialization list. Which inits happen?带有初始化列表的 C++ 委托构造函数。发生了哪些初始化?
【发布时间】:2014-02-19 16:27:47
【问题描述】:

我看过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

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

【问题讨论】:

  • 这是无效代码,正如其他答案和compiler shows 所述。
  • hrmmmm,当我只有委托时,我收到有关成员不在初始化列表中的错误。以及error: MyClass is not a direct base of MyClass。也许这表明我们不使用 c++11,这可能是问题所在。
  • 可能是你的编译器不支持委托构造函数。

标签: c++ class constructor definition delegating-constructor


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2020-12-27
    • 2013-01-29
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    相关资源
    最近更新 更多