在基础构造函数之前初始化成员。可能?

时间:2015-06-19 15:39:40

标签: c++

我有以下代码:

class A{
public:
    A(int* i){
        std::cout << "in A()" << i << std::endl;
    }
};

class B: public A{
public:
    B(): i{new int{10}}, A{i}{
        std::cout << "in B()" << std::endl; 
    }

private:
    int* i;
};

int main()
{
    B b;
}

A构造函数中,我有0(这是预期的)。但我想之前初始化i。它有可能吗?

3 个答案:

答案 0 :(得分:1)

i是类B的数据成员,因此为了创建,必须首先创建类B的对象。所以答案是否定的。

答案 1 :(得分:1)

不可以,因为基类初始化总是在派生类初始化之前。

  

C ++ 11,12.6.2

     

10 在非委托构造函数中,初始化按以下顺序进行:

     
      
  • 首先,仅对于派生程度最高的类(1.8)的构造函数,虚拟基类按照它们出现在基本有向无环图的深度 - 从左到右遍历的顺序进行初始化类,其中“从左到右”是派生类base-speci-list中基类出现的顺序。

  •   
  • 然后,直接基类按声明顺序初始化,因为它们出现在基本指定列表中(不管mem-initializers的顺序如何)。

  •   
  • 然后,按照在类定义中声明的顺序初始化非静态数据成员(同样不管mem-initializers的顺序如何)。

  •   
  • 最后,执行构造函数体的复合语句。

  •   

答案 2 :(得分:1)

  

在基础构造函数之前初始化成员。可能的?

不,那是不可能的。标准要求在初始化类成员之前首先初始化基类。

B(): i{new int{10}}, A{i}{
    std::cout << "in B()" << std::endl; 
}

转换为:

B(): A{i}, i{new int{10}}{
    std::cout << "in B()" << std::endl; 
}