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

运行结果:

思考:

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++ 临时对象的资料请关注其它相关文章!

观今宜鉴古,无古不成今。

详解C++ 中的临时对象

相关文章:

你感兴趣的文章:

标签云: