小結(jié)一下在看《effective C++》的時候额衙,收獲的東西窍侧。
目錄:
- 為什么在構(gòu)造函數(shù)和析構(gòu)函數(shù)里面不能調(diào)用虛函數(shù)?
- 析構(gòu)函數(shù)能不能拋出異常伟件?
- C++ 的對象返回機制
1.為什么在構(gòu)造函數(shù)和析構(gòu)函數(shù)里面不能調(diào)用虛函數(shù) 议经?
因為在派生類創(chuàng)建對象的時候,首先會調(diào)用基類的構(gòu)造函數(shù),然后才調(diào)用自己的亏镰。如下所示:
class Base {
public:
Base() {
cout << "base" << endl;
print();
}
virtual void print() {
cout << "base print" << endl;
}
};
class derived :public Base {
public:
derived() {
cout << "derived" << endl;
}
virtual void print() {
cout << "derived print" << endl;
}
};
int main()
{
{
derived d;
}
return 0;
}
這樣在基類的構(gòu)造函數(shù)里面調(diào)用虛函數(shù)钧忽,那么在創(chuàng)建派生類的時候耸黑,首先會調(diào)用基類的構(gòu)造函數(shù)篮幢。然后執(zhí)行基類的print函數(shù)三椿。因此葫辐,這樣的設(shè)計沒有意義耿战。
ps:
創(chuàng)建派生類對象構(gòu)造函數(shù)調(diào)用的順序:基類 --> 派生類
析構(gòu)派生類對象析構(gòu)函數(shù)調(diào)用的順序:派生類 --> 基類
2. 析構(gòu)函數(shù)能不能拋出異常剂陡?
可以鸭栖,但是最好這個異惩绲可以在析構(gòu)函數(shù)里面處理掉镜粤。
3. C++的對象返回機制
c++ 在函數(shù)里面返回一個對象的時候肉渴,需要調(diào)用兩次拷貝構(gòu)造函數(shù)。 第一次的時候循狰,是把它拷貝到棧上面的臨時對象上面绪钥。第二次是把臨時對象拷貝到main函數(shù)上面的返回值上面程腹。
class obj{
};
obj return_obj(){
return_obj = obj();
return return_obj;
}
int main(){
obj o=return_obj();
}
這樣帶來的一個問題就是寸潦,返回一個對象的開銷比較大社痛。所以蒜哀,在盡可能的情況下面,返回一個對象的引用赊抖。(引用的對象不能是局部變量的引用)寨典。
另外耸成,c++提出一個RVO(RETURN VALUE OPTIMIZATION 返回值優(yōu)化),可以將某些場合對返回對象的拷貝降低一次弦追。直接將對象構(gòu)造在傳出時使用的臨時對象上花竞。因此,可以減少一次復(fù)制的過程零远。