詳解C++ 中的臨時(shí)對(duì)象
C++中臨時(shí)對(duì)象(Temporary Object)又稱無(wú)名對(duì)象。臨時(shí)對(duì)象主要出現(xiàn)在如下場(chǎng)景。
1.建立一個(gè)沒(méi)有命名的非堆(non-heap)對(duì)象,也就是無(wú)名對(duì)象時(shí),會(huì)產(chǎn)生臨時(shí)對(duì)象。
Integer inte= Integer(5); //用無(wú)名臨時(shí)對(duì)象初始化一個(gè)對(duì)象
2.構(gòu)造函數(shù)作為隱式類型轉(zhuǎn)換函數(shù)時(shí),會(huì)創(chuàng)建臨時(shí)對(duì)象,用作實(shí)參傳遞給函數(shù)。
例:
class Integer { public: Integer(int i):m_val(i){} ~Integer(){} private: int m_val; }; void testFunc(Integer itgr) { // do something }
那么語(yǔ)句:
int i = 10; testFunc(i);
會(huì)產(chǎn)生一個(gè)臨時(shí)對(duì)象,作為實(shí)參傳遞到testFunc函數(shù)中。
3.函數(shù)返回一個(gè)對(duì)象時(shí),會(huì)產(chǎn)生臨時(shí)對(duì)象。以返回的對(duì)象最作為拷貝構(gòu)造函數(shù)的實(shí)參構(gòu)造一個(gè)臨時(shí)對(duì)象。
Integer Func() { Integer itgr; return itgr; } void main() { Integer in; in = Func(); }
如下代碼驗(yàn)證以上結(jié)論:
class Integer { public: Integer() { cout<<"Integer default Constructor"<<endl; }; Integer(const Integer& arg) { this->m_val=arg.m_val; cout<<"Integer Copy Constructor"<<endl; }; Integer(int i):m_val(i){ cout<<"Integer Constructor"<<endl; }; Integer& operator=(const Integer& arg) { cout<<"Assignment operator function"<<endl; this->m_val=arg.m_val; } ~Integer(){}; int m_val; }; Integer testFunc(Integer inter) { inter.m_val++; cout<<"before return"<<endl; return inter; } int main(int argc,char* argv[]) { Integer inter(5);//Constructor Integer resutl; //default constructor resutl=testFunc(2);//Constructor,then Copy Constructor,then Assignment operator cout<<resutl.m_val<<endl; getchar(); return 0; }
運(yùn)行結(jié)果:
思考:
1.main函數(shù)中加入如下一條語(yǔ)句會(huì)輸出什么?
Integer re=inter;//輸出Assignment operator還是Copy Constructor
推理應(yīng)該輸出Assignment operator function。但實(shí)際輸出結(jié)果是:Integer Copy Constructor。
原因是:賦值符函數(shù)不能創(chuàng)建新的對(duì)象,它要求”=”的左右對(duì)象均已存在,它的作用就是把”=”右邊的對(duì)象的值賦給左邊的對(duì)象。
2.main函數(shù)中加入如下一條語(yǔ)句會(huì)輸出什么?
Integer re=testFunc(10);
按照以上討論,推理出輸出結(jié)果應(yīng)該是:
Integer Constructor
before return
Integer Copy Constructor
Integer Copy Constructor
但實(shí)際結(jié)果是:
原因是編譯器自動(dòng)優(yōu)化的結(jié)果,只執(zhí)行一次Copy Constructor來(lái)構(gòu)造新的對(duì)象,不會(huì)再次調(diào)用Copy Constructor,以臨時(shí)對(duì)象來(lái)構(gòu)造新的對(duì)象。
以上就是詳解C++ 中的臨時(shí)對(duì)象的詳細(xì)內(nèi)容,更多關(guān)于c++ 臨時(shí)對(duì)象的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)登錄注冊(cè)和忘記密碼功能
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)登錄、注冊(cè)和忘記密碼功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12C++實(shí)現(xiàn)重載矩陣的部分運(yùn)算符
這篇文章主要為大家詳細(xì)介紹了如何利用C++實(shí)現(xiàn)重載矩陣的部分運(yùn)算符,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C++有一定幫助,需要的可以參考一下2022-10-10C++實(shí)現(xiàn)LeetCode(134.加油站問(wèn)題)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(134.加油站問(wèn)題),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07