为什么要用Array&呀
Array& printinfo()
{
return *this;
}
为什么要用Array&,直接返回Array不行么
Array& printinfo()
{
return *this;
}
为什么要用Array&,直接返回Array不行么
2015-10-17
可以直接返回Array,但这样并不好。
&这表明返回的是array引用。
类成员函数有时打算返回类实例自身,就会返回*this的引用。
而有时并不一定需要返回自身,但仍会选择返回引用,原因如下:
函数在返回值的时候,是先用你要返回的变量去构造一个临时变量,再将这个临时变量返回给接受返回值的调用者。在调用者使用过后,这个临时变量再被自动销毁。
如果返回的是一个很大的类实例的话,构造这个临时变量会调用拷贝构造函数,这可能造成很大的运行开销(例子中的情况下array会被整个复制一遍)。为了减少这种负面影响,在一些情况下会选择返回引用类型。注意:这不会改变函数返回时的行为,即——还是会将这个引用临时复制一份——但复制引用类型的开销基本上可以忽略不计。
但需要万分注意:返回引用类型时必须要保证被引用的变量要在函数退出后仍存在(不然返回的那个引用指向谁呢?!) 当然这个代码中这样用没有问题,因为在调用过后 arr1 肯定还是存在的。
P.S. 较新的C++11标准中增加了“右值引用”特性,很好地解决了函数返回时临时变量的麻烦。
作为一个菜鸟,楼上各位大师说的不太懂,所以写出来自己的理解帮助其他菜鸟理解。如果有错,请大神疯狂地喷吧。正文如下:
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的别名)。
自己的理解怪怪的,毕竟作为一个机械专业的学生。
举报