漫谈C++里的“引用”
来源:互联网 发布:京瓷扫描软件 编辑:程序博客网 时间:2024/04/30 16:02
引用“&”是C++新增的概念,注意这里的“&”并不是“取地址”的含义。引用(reference)简单的说就是一个对象的别名。用对象来初始化引用后,那么对象的名字或引用的名字都指向(refer to)该对象,如:
int a=10;
int& ra=a; //ra是a的别名
人们常常会将引用和指针混淆,原因大概是因为C++编译器通常是采用指针的方式去实现引用的。但引用并不是指针。引用与指针的比较如下:
1.不存在空引用,而指针却可以是NULL。
2.所有引用在创建时必须初始化,而指针在定义时不必初始化。
3.一个引用永远指向用来对它进行初始化的那个对象,而指针却可以改变为指向另一个对象。
另外,需要提醒的是,一个指向非常量的引用是不可以用字面值常量进行初始化的。如:
double& d=11.3; //错误!
然而,一个指向常量的引用就可以:
const double& cd=11.3; //OK!
看到上面这个语句你也不必奇怪。当一个指向常量的引用采用一个字面值来初始化时,该引用实际上指向的是一个临时变量,而这个临时变量采用这个字面值初始化。因此,cd并非真的指向字面值11.3,而是指向一个采用11.3初始化的、类型为double的临时变量,并且这个临时变量将一直保留到cd被销毁的时候。
乍一看,引用没有体现其价值,完全没存在的必要。关于这个问题,我们可以看一下C++之父Bjarne Stroustrup的名著《The Design and Evolution of C++》里有关C++语言里引入引用的历史,这会对我们理解引用的作用是很有帮助的。
“引入引用机制主要也是为了支持运算符的重载。”
“C语言对所有函数参数都采用值传递,如果用值传递对象的效率太低或者不合适,用户就可以传递一个指针。在有了运算符重载后,采用这种策略就不行了,因为在这种情况下写法上的方便是最关键的东西,对于大的对象也不能指望使用者去加进所需要的取址运算符。例如:
a = b – c;
是可以接受的写法,但
a = &b - &c;
就不行了。”
引用的主要用途是修饰函数的形参和返回值。在C++中,函数的参数和返回值的传递方式有三种:值传递、指针传递和引用传递。引用具有指针的效率,又具有变量使用的方便性和直观性,而这种方便和直观性是使用指针所欠缺的。当然,就如Bjarne Stroustrup所说的,“如果希望在C++里做更复杂的指针操作,那么就可以用指针”。但是,如果确实只需要使用一下某个对象的“别名”而已,那么引用就是不二的选择了。
- 漫谈C++里的“引用”
- 漫谈C指针第十一讲---参数的引用传递
- 对比C/C++,浅析Java里的指针和引用
- 注意java里的“引用”
- 漫谈php引用计数
- 在C语言里没有C++所谓的“按引用传递”
- C语言引用汇编代码里的全局标号或变量
- 漫谈C指针第一讲---C语言变量的实质
- C++“引用”的理解
- 为什么引用不了App_Code里的类
- PHP里的引用(Reference)
- C++里指针和引用的差别
- vs2008引用不了App_Code里的类
- pro文件里的变量引用
- 引用不了App_Code里的类
- block里的self,避免循环引用
- latex里引用bib的一些问题
- App_Code里的类引用问题
- JSF能否拯救WEB江湖
- 今年的 Valentine 有丝味道
- Google Android
- VB+Mapobject2.0自定义地图图标
- 常用javascript正则匹配
- 漫谈C++里的“引用”
- 我做程序员的两年
- ASP.NET 3.5's ListView and DataPager—Part4:利用ListView和DataPager控件来对数据分页
- DRDA(Distributed Relational Database Architecture )分布式关系数据库体系结构
- Debugging Memory Related Issues in .Net Application Using WinDBG and SOS
- 自我介绍
- 我的第一篇csdnblog文章
- Ajax实现双色表格-采用jQuery实现
- 基于Socket的Java网络编程集粹