2017-05-29 40 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) 
{} 

成員初始化列表語法等效於幾乎當一個簡單的整數是構造的成員時你要做的任務。但要注意,更復雜的子對象將首先被默認構造,然後調用它們的賦值操作符。這可能使業績大幅(惡化)的區別,只是在成員初始化列表中指定他們和構建一次。

相關問題