我有一個用戶定義的類,稱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的另一個構造函數(它帶有參數)。那麼,這導致了什麼?超類的兩個不同的構造函數在創建子類的對象時會在這裏調用。請解釋發生了什麼...是否會創建兩個對象或什麼。
'A(2 * x);'不符合你的期望 - 習慣成員初始化列表! –
*「是否創建兩個對象或是什麼。」* - 構造函數**不創建對象;構造函數爲使用準備對象。該對象在構造函數運行時已經創建。 – axiac
你正在讀這個東西太多了。你已經進入了一個函數體(你已經走過了第一個'''')。當你在一個函數中聲明一個對象並對它做任何事情時會發生什麼?這就是你在這裏做的 - 規則不會因爲函數只是一個構造函數而改變。創建的對象是臨時的,然後在該行被執行後銷燬。 – PaulMcKenzie