C 產生的臨時物件引用

2021-07-01 20:18:52 字數 925 閱讀 9532

統自動生成的臨時物件都是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...