日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

C++之临时对象的构造与析构

發(fā)布時間:2025/3/21 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++之临时对象的构造与析构 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1、臨時對象產(chǎn)生的時間點
對象作參數(shù)(值傳遞)、返回對象(值傳遞)
2、臨時對象析構(gòu)的時間點(重點、難點)
3、臨時對象會降低效率,但是哪些情況必須使用臨時對象?
【注】真正的臨時對象是看不見的,它不會出現(xiàn)在程序代碼中。

示例:

> 【提示】代碼中有輸出this,主要是在單步調(diào)試的時候方便觀看構(gòu)造、拷貝、析構(gòu)的是哪一個對象!#include <iostream> using namespace std; class A { public:A(){cout<<"構(gòu)造"<<this<<endl;}A(const A& a){cout<<"拷貝"<<this<<endl;}virtual ~A(){cout<<"析構(gòu)"<<this<<endl;} }; void f1(A aa) { cout<<"aa = "<<&aa<<endl;//加入此句目的:為了判斷copy出來的臨時對象temp是否和形參對象a是一個對象(答案:是!)//傳參數(shù)時,調(diào)用copy構(gòu)造臨時對象temp,temp和形參aa的地址一樣,即temp和aa實質(zhì)上是一個對象!(只析構(gòu)temp順帶著aa也就被析構(gòu)了!) } A f2() {A aa; //構(gòu)造局部對象aareturn aa; //①先return時拷貝構(gòu)造產(chǎn)生一個臨時對象temp;②然后析構(gòu)局部變量aa,當退出f2()函數(shù)時并沒有析構(gòu)臨時對象。 } A f3(A aa) {cout<<"a = "<<&a<<endl;return aa;//傳參數(shù)時創(chuàng)建臨時對象temp1,temp1 = aa//return時創(chuàng)建臨時對象temp2,temp2是否等于main函數(shù)中的被賦值的對象分兩種情況! //case1: A t1; t1 = f3(t); 臨時對象temp2!= 對象t1 //case2: A t1 = f3(t); 臨時對象temp2 = 對象t1 }

情況一:

int main() {A a1; //構(gòu)造函數(shù)f1(a1);return 0; }

【解釋】執(zhí)行f1(a1);時,執(zhí)行情況:①調(diào)用拷貝構(gòu)造生成臨時對象temp并賦值給形參中的aa(temp和aa是同一個對象);②當退出void f1(A aa)函數(shù)時,臨時對象temp析構(gòu)(因為aa離開了作用域,aa析構(gòu)就等同于temp析構(gòu));③return 0;析構(gòu)main中的a1。
【執(zhí)行結(jié)果】構(gòu)造、拷貝、析構(gòu)、析構(gòu)

情況二:

int main() {A a1;A a2;a2 = f2(); cout<<"a2 = "<<&a2<<endl;return 0; }

【解釋】執(zhí)行到a2 = f2(); 時,執(zhí)行情況是:①進入f2()函數(shù),先構(gòu)造局部對象aa;②return aa; 這行的執(zhí)行情況:先拷貝構(gòu)造一個臨時對象temp,然后碰到return aa;的分號時刻析構(gòu)局部對象aa;退出A f2()函數(shù)體③繼續(xù)執(zhí)行語句a2 = f2();中的“=”號運算符,相當于a2=temp;即把臨時對象temp的值賦值給a2.(注:但是temp和a2不是同一個對象,兩個都需要析構(gòu)) ④執(zhí)行完a2 = f2();語句中的“=”號,就碰到分號“;”,此時臨時對象temp被釋放。⑤return 0;時依次析構(gòu)main函數(shù)中的a2、a1
【執(zhí)行結(jié)果】構(gòu)造、構(gòu)造、構(gòu)造、拷貝、析構(gòu)、析構(gòu)、析構(gòu)、析構(gòu)

情況三:

int main() {A a = f2();cout<<"a = "<<&a<<endl;return 0; }

【解釋】A a2 = f2();語句的執(zhí)行情況:①先執(zhí)行f2(),進入f2()函數(shù)體,構(gòu)造局部對象aa;②再執(zhí)行return aa;語句:return aa調(diào)用拷貝構(gòu)造創(chuàng)建一個臨時對象temp;之后碰到return aa;語句的分號時,析構(gòu)對象aa。退出f2()函數(shù)體 **③執(zhí)行A a = f2();語句的“=”號運算符,把臨時對象temp賦值給對象a(注:此時temp和a是同一個對象,只需要析構(gòu)一個,另一個也就釋放掉)。

【重點】:由于編譯器的優(yōu)化作用,A a =f2();語句并沒有調(diào)用拷貝構(gòu)造函數(shù)創(chuàng)建對象a,編譯器省略了這次拷貝構(gòu)造,因此temp和a是同一個對象,只需要析構(gòu)一個,另一個也就釋放掉——>臨時對象temp析構(gòu)的時間就是main函數(shù)中對象a的時間

  • ④return 0;語句執(zhí)行時,析構(gòu)臨時對象temp(即a也沒有了)。*
    【執(zhí)行結(jié)果】構(gòu)造、拷貝、析構(gòu)、析構(gòu)

情況四:

int main() {A a1;A a2 = f3(a1);cout<<"a2 = "<<&a2<<endl;return 0; }

【解釋】A a2 = f3(a1);執(zhí)行情況:①先執(zhí)行 f3(a1)進入函數(shù)體,copy構(gòu)造臨時對象temp1,并賦值給形參aa(此時temp1和aa是同一個對象),②return aa;語句執(zhí)行情況:先拷貝構(gòu)造臨時對象temp2,再析構(gòu)對象aa(因為此時離開了aa的作用域,temp1也不存在了),退出函數(shù)體。③執(zhí)行A a2 = f2(a1);的“=”號,此時不調(diào)用拷貝構(gòu)造函數(shù),只把臨時對象temp2賦值給a2(原因同情況三,temp2和a2是同一個對象,只需要析構(gòu)一個,另一個也就釋放掉)。④return 0;時釋放臨時對象temp2(即a2也不存在了),再釋放main函數(shù)中的a1對象。
【執(zhí)行結(jié)果】構(gòu)造、拷貝、拷貝、析構(gòu)、析構(gòu)、析構(gòu)

情況五:

int main() {A a1;A a2 ;a2 = f3(a1);cout<<"a2 = "<<&a2<<endl;return 0; }

【解釋】a2 = f3(a1);執(zhí)行情況:①先執(zhí)行 f3(a1)進入函數(shù)體,copy構(gòu)造臨時對象temp1,并賦值給形參aa(此時temp1和aa是同一個對象),②return aa;語句執(zhí)行情況:先拷貝構(gòu)造臨時對象temp2,再析構(gòu)對象aa(因為此時離開了aa的作用域,temp1也不存在了),退出函數(shù)體。③a2 = f3(a1);語句執(zhí)行情況:先“=”號運算符把臨時對象temp賦值給a2(注:temp2和a2不是同一個對象,要析構(gòu)兩次),碰到“;”號時析構(gòu)臨時對象temp2。④return 0;依次析構(gòu)a2、a1
【執(zhí)行結(jié)果】構(gòu)造、構(gòu)造、拷貝、拷貝、析構(gòu)、析構(gòu)、析構(gòu)、析構(gòu)

綜上所述:
臨時對象構(gòu)造時間點是在下面兩個:
對象作參數(shù)(值傳遞)、返回對象(值傳遞)

臨時對象析構(gòu)時間點比較復雜,具體情況具體分析,主要分為兩類:
【解決問題的關(guān)鍵在于】判斷臨時對象和被臨時對象賦值的對象是不是同一個對象?
(1)若不是同一個對象,則臨時對象的析構(gòu)時間是main的主調(diào)函數(shù)語句的“;”號時刻。
(2)若是同一個對象,則臨時對象的析構(gòu)時間就是main的主調(diào)函數(shù)語句中被臨時對象賦值的對象的析構(gòu)時間。
例如:
//case1: A t1; t1 = f3(t); 臨時對象temp2!= 對象t1
臨時對象析構(gòu)時間:執(zhí)行到t1 = f3(t); 語句的“;”號時刻!
//case2: A t1 = f3(t); 臨時對象temp2 = 對象t1
臨時對象析構(gòu)時間:就是t1對象的析構(gòu)時間!

講解的這么詳細,在聽不懂真對不起我。

【友情提示】 可以復制上面的代碼用VS進行單步調(diào)試,調(diào)試鍵F10、F11。

2017/3/2

總結(jié)

以上是生活随笔為你收集整理的C++之临时对象的构造与析构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。