认识C++中的临时对象temporary object 分类: C/C++ 2015-05-11 23:20 137人阅读 评论(0) 收藏

时间:2023-03-08 18:24:53

C++中临时对象又称无名对象。临时对象主要出现在如下场景。

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++中的临时对象temporary object                                                    分类:            C/C++             2015-05-11 23:20    137人阅读    评论(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

但实际结果是:

认识C++中的临时对象temporary object                                                    分类:            C/C++             2015-05-11 23:20    137人阅读    评论(0)    收藏

原因是编译器自动优化的结果,只执行一次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

版权声明:本文为博主原创文章,未经博主允许不得转载。