有关返回对象的说明

来源:互联网 发布:编程培训技术学校 编辑:程序博客网 时间:2024/06/07 08:33

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

使用const引用常见的原因是旨在提高效率。如果函数返回(通过调用对象的方法或将对象作为参数)传递给它的对象,可以通过传递引用来提高方法的效率。比如编写函数Max,他返回两个Vertor对象中的较大一个,该函数将以下面方式被使用:

Vertor force1(50,60);

Vertor force2(10,70);

Vertor max;

max=Max(force,force2);

下面两种实现都是可行的:

//version 1Vertor Max(const Vertor &v1,const Vertor &v2){if(v1.magval()>v2.magval())return v1;elsereturn v2;}//version 2const Vertor & Max(const Vertor &v1,const Vertor &v2){if(v1.magval()>v2.magval())return v1;elsereturn v2;}

这里需要说明的:首先,返回对象将调用复制构造函数,而返回引用不会。因此第二个版本所做的工作更少,效率更高。其次,引用指向的对象应该在调用函数执行时存在。在这个例子中,引用指向force1或force2,它们都是在调用函数中定义的,因此满足这种条件。第三,v1和v2都被声明为const引用,因此返回类型必须为const,这样才匹配。

 

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

两种常用的返回非const对象的情形是,重载赋值操作符以及重载与cout一起使用的<<操作符。前者这样做旨在提高效率,而后者必须这样做。

operate=()的返回值用于连续赋值:

String s1("good stuff");String s2,s3;s3=s2=s1;

在上述代码中,s2.operator=(s2)的返回值被赋给时,为此,返回String对象或者Sring对象的引用都是可行的。

opreator<<()的返回值用于串接输出:

String s1(“good stuff”);

cout<<s1<<"is coming!";

在上述代码中operate<<(cout,s1)的返回值成为一个用于显示字符串“is coming”的对象,返回类型必须是ostream&,而不能仅仅是ostream。如果使用返回类型为ostream,将要求调用ostream类的复制构造函数,而ostream没有公有的复制构造函数。幸运的好似,返回一个指向cout的引用不会带来任何问题,因为cout已经在调用函数的作用域内。

 

3、返回对象

如果被返回的对象是被调用函数中的局部变量,则不应按引用方式返回它,因为在被调用函数执行完毕时,局部对象将调用其析构函数。因此,对控制权回到调用函数时,引用指向的对象将不再存在,在这种情况下,应返回对象而不是引用。


 

 

原创粉丝点击