您的位置:首页 > 编程语言 > C语言/C++

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

2015-01-13 19:25 375 查看
当成员函数或独立的函数返回对象的时候,有几种返回方式可以选择。

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类),则要返回一个指向这种对象的引用。
有些方法可以返回对象,也可以返回指向对象的引用,但是应该首选返回引用,因为效率更高。比如:重载的赋值运算符。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: