返回值返回方式:
-
其他类型
1、<4字节 eax;
2、>4 <=8 eax edx;
3、>8 临时量 -
类类型
不管几个字节,都有临时对象带回。
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;
}
临时对象的优化
条件:临时对象的生成是为了生成新对象
引用可以提升临时对象的生存周期,把临时对象提升成和引用变量相同的生存周期。