2017-05-29 59 views
1

这是我的代码,你也可以从http://cpp.sh/5lsds构造函数在父类中的值不分配给专用变量

#include "iostream" 
using namespace std; 
class X{ 
private: 
    int c; 
public: 
    X(){} 
    X(int b){ 
    c = 11; 
    } 
    int getC(); 
}; 
class Z:public X{ 
public: 
    Z(int n){ 
     X(23); 
    } 
}; 
int main() 
{ 
    Z z(1); 
    cout<<z.getC()<<endl; 
    return 0; 
} 
int X::getC(){ 
    return c; 
} 

运行它,我需要有X(){}线以来,孩子的构造需要调用父级默认构造函数。

如果您从http://cpp.sh/5lsds运行该程序,则可以看到输出为0,而我期望它为11。由于Z构造函数调用构造函数Xint参数,并将其设置c11但输出0

+2

'X(23);'装置来创建临时X,然后将其立即销毁。它无关的'* this' –

+1

如果您来从Java背景的C++,你最好都忘了的X子部分。 –

回答

5

你应该使用member initializer list

在类的构造函数的定义,成员初始化列表指定了直接和虚拟基子对象和非静态数据成员的初始化。

例如,

Z(int n) : X(23) {} 

我需要有X(){}线以来,孩子构造函数需要调用父类的默认构造函数。

对于成员初始化列表,它不再需要(在此代码示例中)。

对于在构造函数体X(23);,你只是创建一个临时X,这无关与基子的ZX;然后X(即X::X())默认的构造将用于它。即它的等效采用:

Z(int n) : X() { // initialize the base suboject X via X::X() 
    X(23);  // create an unnamed temporary via X::X(int) 
} 
4

你不调用基类

Z(int n){ 
    X(23); 
} 

这将创建一个无名的临时X对象,并通过23到它的构造函数的构造函数。它不构造Z.

的X子对象

在C++中,我们构建使用成员初始化列表语法碱和成员:

X(int b) : 
    c(11) 
{} 

Z(int n) : 
    X(23) 
{} 

成员初始化列表语法等效于几乎当一个简单的整数是构造的成员时你要做的任务。但要注意,更复杂的子对象将首先被默认构造,然后调用它们的赋值操作符。这可能使业绩大幅(恶化)的区别,只是在成员初始化列表中指定他们和构建一次。

相关问题