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;
}
 
int 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;
		return *this;
	}

	~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;
	return 0;
}

运行结果:

Integer Constructor
Integer default Constructor
Integer Constructor
before return
Integer Copy Constructor
Assignment operator function
3

阅读以上程序,注意以下几点:
(1)main 函数中加入如下一条语句会输出什么?

Integer re=inter;//输出Assignment operator还是Copy Constructor

推理应该输出 Assignment operator function。但实际输出结果是:Integer Copy Constructor。原因是赋值符函数不能创建新的对象,它要求"=“的左右对象均已存在,它的作用就是把”="右边的对象的值赋给左边的对象。

(2)main 函数中加入如下一条语句会输出什么?

Integer re=testFunc(10);

按照以上讨论,推理出输出结果应该是:

Integer Constructor
Integer Copy Constructor
before return
Integer Copy Constructor
Integer Copy Constructor

但实际结果是:

Integer Constructor
before return
Integer Copy Constructor

原因是编译器自动优化的结果,只执行一次 Copy Constructor 来构造新的对象,不会再次调用 Copy Constructor,以临时对象构造新的对象。


参考文献

[1] Scott Meyers.More Effective C++(第三版)[M].北京:电子工业出版社,2011.1
[2] 关于C++中的临时对象问题

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值