一级棒(Eachfun)
一级棒 - 读书笔记 - C++ Primer - 引用传递的应用范围
RSS订阅
引用传递的应用范围
发表时间:2006-07-26 01:57:17 关键词:C++,MFC,VC,Primer,编程,教程,读书

  经过三篇文章的细述,函数的参数传递应该比较明朗了,经过一番对比,似乎引用传递是最优秀的一种传递方式。第一、它用法很简单,类似于值传递,第二、它功能很强大,类似于指针传递,第三、它很安全,可以避免指针传递带来的危险,第四、它效率高,函数中不必要进行对象的创建、赋值与释放。第五、如果不希望实参被改变,可以使用const修饰形参……
  但是,天下没有这么便宜的午餐!引用传递不是倒处能用的。举个例子:
void Swap(int& a, int& b)
{
  int temp = a;
  a = b;
  b = temp;
}
  以上函数可以进行两个int变量的交换。但是,很多情况下该函数不能调用:
int ia = ib = 1;
short sa = sb = 2;
const int cia = cib = 3;
Swap(ia, ib);//正确
Swap(sa, sb);//错误,short不是int,虽然可以隐式转换为int,但是这个变量不存在
Swap(cia, cib);//错误,这两个参数是const的
Swap(4, 5);//常量不是变量,类似于将short变量传递给函数
Swap(ia+ib, ia-ib);//错误,表达式求值后产生的临时值不是变量
  其中将const参数传递进函数的做法,虽然看起来有些荒诞,实际上某些时候会不经意间做的。某个变量在定义的时候并不是const的,但是在调用某个函数的时候将它作为const形参传入,而该函数内部再调用Swap()函数时,这个变量已经成了局部的const变量。
  以上这个特性反过来应用是很有用的。在多人协作写程序的时候,或者写一个大型程序的时候。你不知道某函数是否用const来保护参数,但是你想保护参数。那么,你就在自己写的原调函数中将该参数保护起来。这样,当你调用某个没有显式指定const引用参数的函数时,编译器就会报错。
void funca(const int& a)
{
  funcb(a);//发生错误
}
void funcb(int& b)
{
  ...;
}
int t;
funca(t);
以上程序会在注释的那行停止编译。因为在它调用了函数b,而b没有声明参数为const。虽然函数b中未必改动参数。

本站特约顾问律师常州东晟律师事务所朱立律师(电话13915029670,QQ646146109)提醒您:
本站文章皆为作者原创,其它媒体(包括但不限于报刊、杂志、网站、电视、电台)未经作者书面许可严禁转载(或部分摘录)!
发表评论
称呼:
QQ:
邮箱:
链接:
内容:
搜索: 百度搜索 Google搜索
Copyright©2000 - 2008 Eachfun.Com, All Rights Reserved 一级棒网络
苏ICP备05080156号
一级棒建站系统 http://www.eachfun.com 一级棒版权所有,未经许可不得商用!