一级棒(Eachfun)
一级棒 - 读书笔记 - C++ Primer - 形参与实参的关系之引用传递
RSS订阅
形参与实参的关系之引用传递
发表时间:2006-07-25 00:47:06 关键词:C++,MFC,VC,Primer,编程,教程,读书

  C++有了“引用传递”后,“形参的改变不影响实参”被判无效。因为传递给函数的并不是一个值,而是变量自身。在函数中定义的形参虽然还是局部变量,但却是一个引用。虽然这个引用的作用域仅限于函数内部,但是由于它与实参就是同一回事,所以对它的操作完全等同于对实参的操作。比如你叫“黑旋风”去买鱼,或者叫“铁牛”去买鱼,去的都是同一个人。
  C++为什么要有“引用传递”这回事?一种说法是只有引用才能达到操作符重载的目的,这个以后再谈。但是,撇开这个不谈,形参是不是引用,直接影响了程序执行的效率。前面提到过,函数调用时要用实参的值去初始化形参,初始化的过程包含了定义一个变量、然后给它赋一个值两个过程,如果这个变量并不是内部变量,而是一个类对象,那么,定义一个类对象可能很复杂,而初始化这个对象一样会很复杂。而引用只是给对象取一个别名,不涉及定义与初始化,离开作用域时也不用释放。
  相比之下,用指针传递可以避免类对象的定义、初始化与释放。只需要付出指针变量的定义、初始化与释放的代价。但是,指针的杀伤力太大。即使是熟练的程序员,也不能保证绝不出现“野指针”,野针的代价几乎无一例外是程序崩溃。
  引用也不是吃素的,如果说指针传递是“帮你配了一把我家的钥匙”,那么引用传递就是直接把我家的财产都交给了你。有时,我们使用引用传递仅仅是为了效率,而不希望实参被修改,那就要记得把形参标记为const,如“UINT GetLength(const CString&)”。
  顺便说一句,指针传递也可以这样做。把形参定义为指向const对象的指针(而不是const指针),可以降低杀伤力,保护实参所对应的内存。如果是普通的值传递,那么有没有const对函数外部并不影响。但是,我个人认为,有时候加上const也是一件好事。如果程序的逻辑并不需要改变参数,而实际上误写了代码,加上const可以让编译器帮我们找出BUG,如:
int Max(const int a, const int b)
{
  return a>b?a:b;
}
  VB没有指针的概念,却有“值传递”和“地址传递”两个概念。比如“Function Func(ByRef i As Integer) As Integer”,变量i接受了实参后,它的改变能影响实参。它的实质就类似于C++中的引用传递。

本站特约顾问律师常州东晟律师事务所朱立律师(电话13915029670,QQ646146109)提醒您:
本站文章皆为作者原创,其它媒体(包括但不限于报刊、杂志、网站、电视、电台)未经作者书面许可严禁转载(或部分摘录)!
相关评论
  • 引用我一直不太理解.今天终于有点感觉了,写得很好.
    person82303846 link未填 QQ82303846 email未填 时间:2009-05-02 23:12:40
1
发表评论
称呼:
QQ:
邮箱:
链接:
内容:
搜索: 百度搜索 Google搜索
Copyright©2000 - 2008 Eachfun.Com, All Rights Reserved 一级棒网络
苏ICP备05080156号
一级棒建站系统 http://www.eachfun.com 一级棒版权所有,未经许可不得商用!