1. 程式人生 > 程式設計 >詳解C++ 中的臨時物件

詳解C++ 中的臨時物件

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

執行結果:

詳解C++ 中的臨時物件

思考:

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

但實際結果是:

詳解C++ 中的臨時物件

原因是編譯器自動優化的結果,只執行一次Copy Constructor來構造新的物件,不會再次呼叫Copy Constructor,以臨時物件來構造新的物件。

以上就是詳解C++ 中的臨時物件的詳細內容,更多關於c++ 臨時物件的資料請關注我們其它相關文章!