C 暫時物件

2021-09-22 12:12:53 字數 1517 閱讀 6434

c++真正所謂的暫時物件是不可見的——不會在你的原始碼**現。僅僅要你產生乙個non-heap object而沒有為它命名,便誕生了乙個暫時物件。此等匿名物件通常發生於兩種情況:

一是當隱式型別轉換(implicit type conversions)被施行起來以求函式呼叫可以成功。

二是當函式返回物件的時候;

其實另一種情況就是當你建立乙個non-heap object物件,也就是無名物件的時候。

這裡舉乙個常見的easy忽視的錯誤:

#include using namespace std;

int main(int argc, char *ar**)

這個程式執行的時候你可能會得到正確的結果,但其實這裡的做法是不安全的,s1+s2產生的暫時物件會在表示式的結尾被析構。所以假設跟蹤堆疊會發如今print語句中s的記憶體空間已經指向未知位址了。

這裡針對3種會產生暫時物件的情況舉例進行說明:

1.隱式型別轉換

void uppercasify(string& str);

// changes all chars in str to upper case

char subtlebookplug = "effective c++";

uppercasify(subtlebookplug); //error!!!

由於要使函式呼叫成功,必須將subtlebookplug轉換成string型別,而編譯器覺得你要改變的subtlebookplug。而型別轉換後將產生乙個型別為string的暫時物件,而在void uppercasify(string& str)中。被改變的將是這個暫時物件,而不是subtlebookplug,這顯然不是程式猿所期望的。所以c++明智地禁止了這樣的行為

2.函式返回物件

#include using namespace std;

int func()

int main(int argc, char *ar**)

函式中的返回值會以值拷貝的形式複製到被呼叫函式棧中的乙個暫時物件。這裡表示式func()建立了乙個暫時物件。用來儲存func()函式返回的物件,暫時物件由func()返回的itgr物件拷貝構造。暫時物件賦值給in後,賦值表示式結束,暫時物件被析構。所以這裡就有乙個問題。

int& intref = func();
假設用乙個暫時物件去初始化intref引用,一旦該表示式執行結束,暫時物件的生命週期也就結束了。引用的實體已經不復存在。

3.no heap的物件

int& intref = int(5);

int itgr = int(5);

calculate(int(5));

上述表示式中的暫時物件用來完畢初始化引用。拷貝構造和實參等作用。

關於暫時物件生命週期的延長等問題,後面的部落格再更新吧。越來越覺得c++真心麻煩…

STL暫時小結

暫時在stl告一段落,用oj上的題目來告一段落小結,以後抽空補充了 第一題 詞典 知識點 對map的使用 find方法 用find函式來定位資料出現位置,它返回的乙個迭代器,當資料出現時,它返回資料所在位置的迭代器,如果map中沒有要查詢的資料,它返回的迭代器等於end函式返回的迭代器 cin.ge...

暫時沒有標題 三

安延蹲在女孩旁邊和她聊了很久,女孩始終重複著 你叫他下來,你叫他下來。安延說,你看多少人去叫他了他都不下來 女孩似乎沒有聽見安延在說什麼,依舊要求安延叫靳波下來。安延耐心的勸解,無濟於事。最後安延說,你就當我是靳波吧。女孩沉默了一會兒,試圖站起來,接著她嘶啞而痛苦地叫了一聲,一屁股坐到了地上。她蹲太...

INIT WORK的暫時理解

scsih fw event add insert and queue up fw event ioc per adapter object fw event object describing the event context this function will acquire ioc fw ...