詳解C++ 中的臨時物件
阿新 • • 發佈:2020-08-27
C++中臨時物件(Temporary Object)又稱無名物件。臨時物件主要出現在如下場景。
1.建立一個沒有命名的非堆(non-heap)物件,也就是無名物件時,會產生臨時物件。
Integer inte= Integer(5); //用無名臨時物件初始化一個物件
2.建構函式作為隱式型別轉換函式時,會建立臨時物件,用作實參傳遞給函式。
例:
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);
會產生一個臨時物件,作為實參傳遞到testFunc函式中。
3.函式返回一個物件時,會產生臨時物件。以返回的物件最作為拷貝建構函式的實參構造一個臨時物件。
Integer Func() { Integer itgr; return itgr; } void main() { Integer in; in = Func(); }
如下程式碼驗證以上結論:
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; }
執行結果:
思考:
1.main函式中加入如下一條語句會輸出什麼?
Integer re=inter;//輸出Assignment operator還是Copy Constructor
推理應該輸出Assignment operator function。但實際輸出結果是:Integer Copy Constructor。
原因是:賦值符函式不能建立新的物件,它要求”=”的左右物件均已存在,它的作用就是把”=”右邊的物件的值賦給左邊的物件。
2.main函式中加入如下一條語句會輸出什麼?
Integer re=testFunc(10);
按照以上討論,推理出輸出結果應該是:
Integer Constructor
before return
Integer Copy Constructor
Integer Copy Constructor
但實際結果是:
原因是編譯器自動優化的結果,只執行一次Copy Constructor來構造新的物件,不會再次呼叫Copy Constructor,以臨時物件來構造新的物件。
以上就是詳解C++ 中的臨時物件的詳細內容,更多關於c++ 臨時物件的資料請關注我們其它相關文章!