学习C++——有关返回对象的总结

当成员函数或独立的函数返回对象的时候,有几种返回方式可以选择。

1、返回指向const对象的引用

使用const引用的主要原因是提高效率。
Vector force1(20,43);
Vector force2(45,22);
Vector max;
max = Max(force1,force2);

//版本1
Vector Max(const Vector & v1,const Vector & v2)
{
	if(v1.magval() > v2.magval())
		return v1;
	else
		return v2;
}
//版本2
const Vector & Max(const Vector & v1,const Vector & v2)
{
	if(v1.magval() > v2.magval())
		return v1;
	else
		return v2;
}
总结:
  • 这两种方法都是可行的。
  • 返回对象将调用复制构造函数,而返回引用则不会调用复制构造函数,所以第二个版本的效率更高。
  • 返回的引用,必须是在调用函数中存在的对象,而不能是被调用的函数中的局部对象,否则当函数返回的时候,局部对象也会消失,所以返回的引用没意义了。
  • 因为v1,v2都是const 引用,所以返回类型也必须是const。

2、返回指向非const对象的引用

两种情况:
  • 重载赋值运算符(StringBad & StringBad::operator=(const StringBad & st) )
operator=()的返回值用于连续 赋值。str3 = str2 = str1;
  • 重载与cout一起使用的<<运算符
operator<<()的返回值用于串接输出。cout << str1 << "hello word.";返回类型必须是 ostream  &。如果返回类型是ostream则要求ostream类的复制构造函数,但是ostream没有复制构造函数。

3、返回对象

如果被返回的对象是被调用函数中的局部变量,则不能按引用的方式返回它,因为在被调用函数执行完之后,局部对象就会调用析构函数。因此当返回到调用函数之后,引用的对象将不再存在。所以这个时候应该返回对象。被 重载的算术运算符就是一种情况。
str3 = str1 + str2; 调用复制构造函数,把str1和str2的值保存在一个临时对象中,然后在将临时对象中的值复制到str3中。

4、返回const对象

如果Vector::operator+()的返回类型被声明为const Vector,则sum = v1 + v2;正确,但是v1+v2=sum;将错误。

总结:

  • 如果方法或函数要返回局部对象,则应该返回对象,而不是返回指向对象的引用。(这种情况下,将使用复制构造函数生成返回的对象)
  • 如果方法或函数要返回一个没有复制构造函数的类(如ostream类),则要返回一个指向这种对象的引用。
  • 有些方法可以返回对象,也可以返回指向对象的引用,但是应该首选返回引用,因为效率更高。比如:重载的赋值运算符。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值