2015-04-15 129 views
1

我有一個用戶定義的類,稱A.我有公開延伸A.調用超類的constuctor兩次在子類的構造函數

當我限定B的構造的另一用戶定義的類B,I有在B的構造函數的成員初始化列表中調用A的構造函數,否則編譯器將調用默認的構造函數。

class A { 
    int a; 
public: 
    A(int x = 0) { 
     a = x; 
    } 
}; 

class B : public A { 
    int b; 
public: 
    B(int x = 0) : A(2*x) { 
     b = x; 
    } 
}; 

現在,我明白這一切背後的邏輯。不過,我想知道是發生了什麼當我這樣做,而不是:

class A { 
    int a; 
public: 
    A(int x = 0) { 
     a = x; 
    } 
}; 

class B : public A { 
    int b; 
public: 
    B(int x = 0) { 
     A(2*x); 
     b = x; 
    } 
}; 

我的意思是,大家都知道,編譯器會調用A的默認構造函數它進入B的構造函數體前。現在,B的構造函數體的第一行是調用A的另一個構造函數(它帶有參數)。那麼,這導致了什麼?超類的兩個不同的構造函數在創建子類的對象時會在這裏調用。請解釋發生了什麼...是否會創建兩個對象或什麼。

+0

'A(2 * x);'不符合你的期望 - 習慣成員初始化列表! –

+1

*「是否創建兩個對象或是什麼。」* - 構造函數**不創建對象;構造函數爲使用準備對象。該對象在構造函數運行時已經創建。 – axiac

+0

你正在讀這個東西太多了。你已經進入了一個函數體(你已經走過了第一個'''')。當你在一個函數中聲明一個對象並對它做任何事情時會發生什麼?這就是你在這裏做的 - 規則不會因爲函數只是一個構造函數而改變。創建的對象是臨時的,然後在該行被執行後銷燬。 – PaulMcKenzie

回答

2

現在,B的構造函數體的第一行是調用另一個構造函數A(它帶參數)。那麼,這導致了什麼?

它構造了一個臨時對象A,臨時對象被立刻拋棄。該調用與初始化BA部分無關。

3

這不會調用B被初始化的A子對象的構造函數。相反,它會創建並銷燬類型爲A的臨時對象。調用基礎子對象構造函數的唯一方法是通過初始化列表,如第一個示例中所示。

相關問題