随笔 (关于引用)

为何要使用引用

传统返回机制与按值传递函数参数类似:计算关键字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;
} 
第一条语句创建一个无名的T结构,并让指针*newf指向该结构,因此*newf就是该结构。这个方法存在一个问题:在不再需要new分配的内存是,应使用delete来释放他们。调用clone()隐藏了对new的调用,者使得以后很容易忘记delete来释放内存。

为何将const用于引用返回类型

假设你要使用引用返回值,但又不允许执行赋值操作,只需将返回类型声明为const引用,即不可改变的左值。通过省略const,可以编写更简洁代码,但其含义也更加模糊。
通常,应避免在设计中添加模糊的特性,因为模糊特性会增加犯错的机会。将返回类型声明为const引用,可以避免你犯错。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值