詳解C++ 中的臨時(shí)對(duì)象
C++中臨時(shí)對(duì)象(Temporary Object)又稱(chēng)無(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ù)作為隱式類(lèi)型轉(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++的static關(guān)鍵字及變量存儲(chǔ)位置總結(jié)
今天看博文時(shí),看到了c++的static關(guān)鍵字的一些總結(jié),還涉及到了一些代碼的存儲(chǔ)位置;接下來(lái)為您詳細(xì)呈現(xiàn)2012-11-11
基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的掃雷小游戲
這篇文章主要為大家詳細(xì)介紹了基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
C++實(shí)現(xiàn)std::set的示例項(xiàng)目
std::set是C++標(biāo)準(zhǔn)庫(kù)中的關(guān)聯(lián)容器,提供有序唯一元素集合,本文就來(lái)介紹一下std::set的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下2025-02-02
C語(yǔ)言實(shí)現(xiàn)輸出平均成績(jī)最高學(xué)生的信息
這篇文章主要介紹利用C語(yǔ)言實(shí)現(xiàn)輸出平均成績(jī)最高學(xué)生的信息,文章舉例說(shuō)明并附有詳細(xì)代碼,需要的朋友可以參考一下2021-10-10
C/C++使用C語(yǔ)言實(shí)現(xiàn)多態(tài)
這篇文章主要介紹了C/C++多態(tài)的實(shí)現(xiàn)機(jī)制理解的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下,希望能給你帶來(lái)幫助2021-08-08
C語(yǔ)言利用cJSON解析JSON格式全過(guò)程
cJSON是用于解析json格式字符串的一套api,非常好用,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言利用cJSON解析JSON格式的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04
C/C++的浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)方式分析及實(shí)例
這篇文章主要介紹了C/C++的浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)方式分析及實(shí)例的相關(guān)資料,需要的朋友可以參考下2016-11-11
C++結(jié)合OpenCV實(shí)現(xiàn)RRT算法(路徑規(guī)劃算法)
這篇文章主要介紹了C++結(jié)合OpenCV實(shí)現(xiàn)RRT算法,RRT算法整體框架主要分為rand、near、new三點(diǎn)的建立和near與new之間的安全性檢查,需要的朋友可以參考下2022-05-05

