返回引用类型的何谓“引用”
引用就是某个目标变量的“别名”(alias),对引用的操作与对变量直接操作效果完全相同。
申明一个引用的时候,切记要对其进行初始化。引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,不可以把该引用名作为其他变量名的别名(注:再次执行相关操作只能是赋值,而不是改改变引用的对象)。声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元(好多书上是这样说的,但是这会给初学者造成特别大的困惑,既然是一个类型,为什么没有空间呢?其实它是有空间的:VC++6.0上的处理是给引用分配一个指针大小的空间,用以存放被应用变量的地址,具体内容可参考(《C++程序设计》(第四版)清华大学 —6.8.1 指针与引用)。不能建立数组的引用。
A a(){...;return *this;}//会调用拷贝构造函数和析构函数
A& a(){...;return *this;}//不会调用拷贝构造函数和析构函数
//应该都能够作为左值。
当返回一个变量时,会产生拷贝。当返回一个引用时,不会发生拷贝,你可以将引用看作是一个变量的别名,就是其他的名字,引用和被引用的变量其实是一个东西,只是有了两个名字而已。
问题的关键是,当你想要返回一个引用而不是一个拷贝时,你要确保这个引用的有效性,比如:
int & fun() { int a; a=10; return a; }
这样是不行的,因为a会在fun退出时被销毁,这时返回的a的引用是无效的。
这种情况下,如果fun的返回类型不是int & 而是int就没有问题了。
因此,要返回一个引用时,“临时变量”不能是“临时”的,至少得等函数外部使用完毕这个引用之后,才能销毁它。