为何要使用引用
传统返回机制与按值传递函数参数类似:计算关键字return后面的表达式,并将结果返回给调用函数。从概念上说,这个值被复制到一个临时位置,而调用函数将使用这个值。
double m = sqrt(16.0);
cout << sqrt(25.0);
在第一条语句中,值4.0被赋值到一个临时位置,然后被复制给m。在第二条语句中,值5.0被复制到一个临时位置,然后被传递给cout。
如果一个函数返回一个结构,而不是指向结构的引用,将把整个结构复制到一个临时位置,再将这个拷贝复制到左值上。但在返回值是引用时,将直接将结构的地址赋值到左值,其效率更高。
注意:返回引用的函数实际上是被引用的变量的别名。
返回引用时需要注意的问题
应避免返回函数终止时不再存在的内存单元引用
const T & clone(T & f)
{
T newf;
newf = f;
return newf;
}
该函数返回一个指向临时变量(newf)的引用,函数运行完毕后它将不再存在。为避免这种问题,最简单的方法是,返回一个作为参数传递给函数的引用。作为参数的引用将指向调用函数使用的数据,因此返回的引用也将指向这些数据。
T & clone(T & f, const T & s)
{
f = s;
return f;
}
另一种方法就是用new来分配新的存储空间。使用new为数据分配内存空间,并返回指向该内存空间的指针。
const T & clone(T & f)
{
T * newf; // 1
*newf = f;
return *newf;
}