統自動生成的臨時物件都是const的
#include using namespace std;
class a {};
class b
b(a& a){}
};class b1: public b
};int main()
將b1(const b& b)的const修飾符去掉,編譯就不能通過,報錯說沒有匹配的函式,這是為什麼?
分析:非const的引用引數只能是相同型別,const的引用引數可以傳相關型別的引數進來,加上const才能接受"右值(right value)"引用。
b(a& a){} 不但是乙個建構函式,而且是乙個自定義的型別轉換操作(a->b),如果要去掉這種非有意的自定義型別轉換,使用 explicit b(a& a){}。
b(a& a){}是乙個隱式的型別轉換函式,當執行b1 b1(a)時會自動呼叫這個函式將a轉換成b型別的臨時物件b。這種系統自動生成的臨時物件都是const的,而const物件是無法轉換成非const物件的,所以b1(const b& b):b(b)這裡一定要加const.
下面還有例子:
string foo( );
void bar(string & s);
那麼下面的表示式將是非法的:
bar(foo( ));
bar("hello world");
原因在於 foo( ) 和 "hello world" 串都會產生乙個臨時物件,而在 c++ 中,這些臨時物件都是const 型別的。因此上面的表示式就是試圖將乙個 const 型別的物件轉換為非 const 型別,這是非法的。引用型引數應該在能被定義為 const 的情況下,盡量定義為const的。
臨時物件的產生與運用
所謂的臨時物件,就是一種無名物件。它的出現如果不在程式設計師的預期之下 例如,任何 pass by value操作都會引發copy操作,於是就形成了乙個臨時物件 這往往會造成效率上的負擔,但是在有些情況下,我們會刻意製造一些臨時物件,卻又會使程式乾淨清爽。刻意製造臨時物件的方法是,在型別名稱之後直接...
避免產生臨時 隱式 物件
產生乙個物件,如果這個物件很大並且這個物件是在乙個迴圈裡面產生的,是特別耗資源的,因為編譯器要找到一塊合適的記憶體,如果沒有合適的還要整理磁碟碎片並合併為一塊合適的物件儲存區。因此,在程式設計中一定要小心的產生臨時物件。臨時物件在c 語言中的特徵是未出現在源 中,從堆疊中產生的未命名物件。這裡需要特...
MFC臨時物件的所產生的BUG
現象 檢視類中響應訊息時呼叫對話方塊 cdlgconfig dlg this if dlg.domodal idok 在對話方塊構造引數中呼叫 ccaptestview m pparent getparent m fourmin m pparent m fourmin m emin m pparen...