为了账号安全,请及时绑定邮箱和手机立即绑定

为什么要用Array&呀

Array& printinfo()

{

return *this;

}     

为什么要用Array&,直接返回Array不行么

正在回答

3 回答

可以直接返回Array,但这样并不好。

&这表明返回的是array引用。

类成员函数有时打算返回类实例自身,就会返回*this的引用。

而有时并不一定需要返回自身,但仍会选择返回引用,原因如下:

函数在返回值的时候,是先用你要返回的变量去构造一个临时变量,再将这个临时变量返回给接受返回值的调用者。在调用者使用过后,这个临时变量再被自动销毁。

如果返回的是一个很大的类实例的话,构造这个临时变量会调用拷贝构造函数,这可能造成很大的运行开销(例子中的情况下array会被整个复制一遍)。为了减少这种负面影响,在一些情况下会选择返回引用类型。注意:这不会改变函数返回时的行为,即——还是会将这个引用临时复制一份——但复制引用类型的开销基本上可以忽略不计。

但需要万分注意:返回引用类型时必须要保证被引用的变量要在函数退出后仍存在(不然返回的那个引用指向谁呢?!)  当然这个代码中这样用没有问题,因为在调用过后 arr1 肯定还是存在的。


P.S. 较新的C++11标准中增加了“右值引用”特性,很好地解决了函数返回时临时变量的麻烦。

5 回复 有任何疑惑可以回复我~
#1

onemoo

续上,没看完整个视频,回答得不准确。 看到视频中在调用过 printinfo 函数后,紧接着又调用了 setLen。 那么如果是直接返回Array,则调用setLen是调用那个临时变量的setLen,也就是改变的是临时变量的len。 arr1的len不会有任何改变。 既然目的是要返回类实例自身,就更要将返回类型声明为引用了。
2015-10-18 回复 有任何疑惑可以回复我~
#2

qq_赛塞涩_0 提问者

非常感谢!
2015-10-18 回复 有任何疑惑可以回复我~
#3

培根熏肉

不明白的是什么叫一个函数返回类型为一个类?晕死啊
2016-01-09 回复 有任何疑惑可以回复我~
#4

onemoo 回复 培根熏肉

函数是有返回类型的,这个返回类型就是声明函数时写在函数名前面的那个类型。 Array printinfo() // 这个printInfo函数的返回类型就是Array,Array是一个类。
2016-01-09 回复 有任何疑惑可以回复我~
查看1条回复

作为一个菜鸟,楼上各位大师说的不太懂,所以写出来自己的理解帮助其他菜鸟理解。如果有错,请大神疯狂地喷吧。正文如下:

arr1.printInfo().setlen(10);

上面的语句连用两个点号,第一个点好理解,即调用实例化的对象arr1里的printInfo函数。第二个呢?我们看头文件中的定义(先写出来没有&符号的):

Array printInfo();

这个语句呢,相当于实例化Array类的另外一个对象名字叫做printInfo()。所以,第二个点号后的setlen相当于调用printinfo这个对象里的setlen函数。所以setlen(10)只是对printinfo中的len值进行了改变,并不会影响到arr1的len值(注意printinfo虽然是实例化的一个对象,但它又是arr1这个对象的成员)。修改如下:

Array& printInfo();

这时,返回值为引用类型,即函数printinfo返回值为一个对象的引用,也就是arr1的引用。所以此时再调用printinfo的setlen当然就会改变arr1的len值(printinfo成为了arr1的别名)。

自己的理解怪怪的,毕竟作为一个机械专业的学生。

1 回复 有任何疑惑可以回复我~
#1

onemoo

确实理解错了。 ...这个语句呢,相当于实例化Array类的另外一个对象名字叫做printInfo... —— 不不,这不是一个叫printInfo的Array类。 所有的函数都有返回类型(就算返回的是void,语法上void也算是类型) Array printInfo() 这是声明了一个叫printInfo的函数,其返回类型为Array。 Array& printInfo() 这是声明了一个叫printInfo的函数,其返回类型为Array&,即Array引用。
2016-01-09 回复 有任何疑惑可以回复我~

&引用之后可以对该对象进行操作(修改len值等)。Array只是临时变量,不能对原来的对象进行修改。

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
C++远征之封装篇(下)
  • 参与学习       70919    人
  • 解答问题       514    个

封装--面向对象三大特征之一,通过案例让C++所学知识融会贯通

进入课程

为什么要用Array&呀

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信