类返回值

返回值返回方式:

  1. 其他类型
    1、<4字节 eax;
    2、>4 <=8 eax edx;
    3、>8 临时量

  2. 类类型
    不管几个字节,都有临时对象带回。

class Test
{
public:
	Test()
	{}
	Test(int a,int b):ma(a),mb(b)
	{}
	Test(const test& rhs)
	{
		ma = rhs.ma;
		mb = rhs.mb;
	}
	Test& operator=(const Test& rhs)
	{
		if(this != &rhs)
		{
			ma = rhs.ma;
			mb = rhs.mb;
		}
		return *this;
	}
	~Test()
	{}
private:
	int ma;
	int mb;
};

Test getobject(Test lhs)//形参对象调用拷贝构造生成
{
	Test tmp(10,20);//调用构造函数生成局部对象tmp
	tmp = lhs;
	return tmp;//return调用拷贝构造函数生成一个临时对象,这个临时对象中保存的是tmp的值
}

Test getobject(Test& lhs)//形参传入对象的引用,相比于传入类类型,少一个对象的生成即少两个函数的调用(构造函数、析构函数)
{
	Test tmp(10,20);//调用构造函数生成局部对象tmp
	tmp = lhs;
	return tmp;//return调用拷贝构造函数生成一个临时对象,这个临时对象中保存的是tmp的值
}

Test& getobject(Test& lhs)
{
	Test tmp(10,20);//调用构造函数生成局部对象tmp
	tmp = lhs;
	//return tmp;//return调用拷贝构造函数生成一个临时对象,这个临时对象中保存的是tmp的值
	//返回的是tmp&,即tmp局部对象的地址,因为不能返回局部变量的指针和引用,所以逻辑出错
	return Test(tmp);//显示生成临时对象做返回值用,return后系统还要提供一个做返回值的临时对象(新对象)
	//1、Test(tmp)
	//2、Test(Test(tmp))   -> return之后的对象被优化
}

int main()
{
	Test test1(20,30); //调用构造函数生成test1
	Test rt;//调用默认的拷贝构造生成接收返回值的对象rt
	rt = getobject(test1);
	return 0;
}

临时对象的优化
条件:临时对象的生成是为了生成新对象

引用可以提升临时对象的生存周期,把临时对象提升成和引用变量相同的生存周期。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值