詳解C++ 中的臨時對象
C++中臨時對象(Temporary Object)又稱無名對象。臨時對象主要出現(xiàn)在如下場景。
1.建立一個沒有命名的非堆(non-heap)對象,也就是無名對象時,會產(chǎn)生臨時對象。
Integer inte= Integer(5); //用無名臨時對象初始化一個對象
2.構(gòu)造函數(shù)作為隱式類型轉(zhuǎn)換函數(shù)時,會創(chuàng)建臨時對象,用作實參傳遞給函數(shù)。
例:
class Integer
{
public:
Integer(int i):m_val(i){}
~Integer(){}
private:
int m_val;
};
void testFunc(Integer itgr)
{
// do something
}
那么語句:
int i = 10; testFunc(i);
會產(chǎn)生一個臨時對象,作為實參傳遞到testFunc函數(shù)中。
3.函數(shù)返回一個對象時,會產(chǎn)生臨時對象。以返回的對象最作為拷貝構(gòu)造函數(shù)的實參構(gòu)造一個臨時對象。
Integer Func()
{
Integer itgr;
return itgr;
}
void main()
{
Integer in;
in = Func();
}
如下代碼驗證以上結(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;
}
運行結(jié)果:

思考:
1.main函數(shù)中加入如下一條語句會輸出什么?
Integer re=inter;//輸出Assignment operator還是Copy Constructor
推理應(yīng)該輸出Assignment operator function。但實際輸出結(jié)果是:Integer Copy Constructor。
原因是:賦值符函數(shù)不能創(chuàng)建新的對象,它要求”=”的左右對象均已存在,它的作用就是把”=”右邊的對象的值賦給左邊的對象。
2.main函數(shù)中加入如下一條語句會輸出什么?
Integer re=testFunc(10);
按照以上討論,推理出輸出結(jié)果應(yīng)該是:
Integer Constructor
before return
Integer Copy Constructor
Integer Copy Constructor
但實際結(jié)果是:

原因是編譯器自動優(yōu)化的結(jié)果,只執(zhí)行一次Copy Constructor來構(gòu)造新的對象,不會再次調(diào)用Copy Constructor,以臨時對象來構(gòu)造新的對象。
以上就是詳解C++ 中的臨時對象的詳細內(nèi)容,更多關(guān)于c++ 臨時對象的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++的static關(guān)鍵字及變量存儲位置總結(jié)
今天看博文時,看到了c++的static關(guān)鍵字的一些總結(jié),還涉及到了一些代碼的存儲位置;接下來為您詳細呈現(xiàn)2012-11-11
C/C++的浮點數(shù)在內(nèi)存中的存儲方式分析及實例
這篇文章主要介紹了C/C++的浮點數(shù)在內(nèi)存中的存儲方式分析及實例的相關(guān)資料,需要的朋友可以參考下2016-11-11
C++結(jié)合OpenCV實現(xiàn)RRT算法(路徑規(guī)劃算法)
這篇文章主要介紹了C++結(jié)合OpenCV實現(xiàn)RRT算法,RRT算法整體框架主要分為rand、near、new三點的建立和near與new之間的安全性檢查,需要的朋友可以參考下2022-05-05

