我稍微上,如果我做了以下會發生什麼困惑:的一些簡單的構造函數代碼解釋
class a{
int i;
public:
a(){}
};
class b: public a{
};
int main(){
b b1;
}
由於類b
沒有構造,它使用什麼構造?它使用默認構造函數a
嗎?或者它自己的編譯器生成一個?
我稍微上,如果我做了以下會發生什麼困惑:的一些簡單的構造函數代碼解釋
class a{
int i;
public:
a(){}
};
class b: public a{
};
int main(){
b b1;
}
由於類b
沒有構造,它使用什麼構造?它使用默認構造函數a
嗎?或者它自己的編譯器生成一個?
由於B類沒有構造函數,它使用什麼構造?它使用默認的構造函數嗎?或者它自己的編譯器生成一個?
這看起來有點棘手。
在C++標準的條款,類獲得編譯器生成的構造函數沒有參數當程序員沒有明確指定一個構造函數。從概念上講,b
得到這樣一個默認的構造函數,然後調用構造函數a
。
在另一個層面上,在一個優化的編譯器既不構造有什麼 - 他們可能(也可能不會)被完全消除,「不存在」,甚至爲一個空函數。所以 - 在這個級別 - 談論b
的構造函數調用a
的構造函數就是廢話。
恕我直言,重要的是要了解這兩方面。
乙級將有一個編譯器生成的構造,這將依次調用的構造函數。
它有一個編譯器生成的「違約」默認的無參數的構造函數和編譯器生成的「默認」的拷貝構造函數。如果您的編譯器支持它,它也有一個由編譯器生成的「默認」移動構造函數。
class b
會由編譯器生成的默認構造函數。由於b
繼承a
,訂單將首先構造a
,然後b
。
有兩個構造函數將被調用 - 第一個構造函數a
用於基類初始化,然後是構造函數b
。由於您沒有爲b
定義構造函數,編譯器會爲您生成一個默認的構造函數。由於您的b
類沒有任何需要構造的成員,因此該默認構造函數將爲空。