認識C++中的臨時對象temporary object 分類: C/C++ 2015-05-11 23:20 137人閱讀 評論(0) 收藏

C++中臨時對象又稱無名對象。臨時對象主要出如今以下場景。html

1.創建一個沒有命名的非堆(non-heap)對象,也就是無名對象時,會產生臨時對象。markdown

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.函數返回一個對象時,會產生臨時對象。以返回的對象最做爲拷貝構造函數的實參構造一個臨時對象。ui

Integer Func()
{
    Integer itgr;
    return itgr;
}

void main()
{
    Integer in;
    in = Func();
}

以下代碼驗證以上結論:this

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;
}

運行結果:
這裏寫圖片描述spa

思考:
1.main函數中加入以下一條語句會輸出什麼?code

Integer re=inter;//輸出Assignment operator仍是Copy Constructor

推理應該輸出Assignment operator function。但實際輸出結果是:Integer Copy Constructor。
緣由是:賦值符函數不能建立新的對象,它要求」=」的左右對象均已存在,它的做用就是把」=」右邊的對象的值賦給左邊的對象。htm

2.main函數中加入以下一條語句會輸出什麼?對象

Integer re=testFunc(10);

按照以上討論,推理出輸出結果應該是:
Integer Constructor
before return
Integer Copy Constructor
Integer Copy Constructor
但實際結果是:
這裏寫圖片描述
緣由是編譯器自動優化的結果,只執行一次Copy Constructor來構造新的對象,不會再次調用Copy Constructor,以臨時對象來構造新的對象。

參考文獻

[1]Scott Meyers.More Effective C++(第三版)[M].北京:電子工業出版社,2011.1
[2]http://www.cnblogs.com/daocaoren/archive/2011/07/19/2110258.html

相關文章
相關標籤/搜索