1.简介
引用是C++引入的新语言特性。从语意上来说,引用就是一个变量的别名,就好象古代人的“字”和“号”,东坡居士和苏轼只是一个人的不同称呼。对引用的操作对变量产生的影响与对变量直接操作完全一样。例如:
int i = 0;
int & iRef = i;
iRef++; // i = iRef = 1
尽管引用不使用指针的操作符(*, ->)但是,它看上去跟指针好象并没有区别,而且就上面的例子而言,这个引用所产生的作用完全可以由指针完成。那么为什么C++中还要增加这样一个特性呢?引用显然应该具备指针不能完成的功能,否则它就失去了价值。这方面的探讨我们留到第3节。
2.引用的语法
在这里我们只讨论一些语法相关的问题。
·引用必须在定义的同时初始化
int i;
int & j; // 错误,没有初始化。
int & k=i; // 正确
这个例子有个很好的比喻,小时候小朋友间会互相起“外号”,这些外号在产生的时候总是有所指的,即针对一个具体的小朋友的。引用也一样,定义的时候,必须指明它是谁的别名。
·外部(extern)引用定义不必给出初值
extern int & i; // 正确,不必给出初值
·引用初始化后不能再使其成为其它变量的引用
int j, k;
int & i = j;
i = k; // 错误,不能更改!
引用类似一个常量指针(int * const p),不能修改引用的指向。
·引用的地址
假设有如下定义:
int j;
int & i = j;
那么,&i应该是什么呢?是一个“引用的地址”么?答案是:no。&i = &j,就是j这个变量的地址。
3.引用使用技巧
引用是除指针外另一个可以产生多态效果的手段。这意味着,一个基类的引用可以指向它的派生类实例。例如:
class A;
class B: public A
{
...
};
B b;
A & aRef = b; // 基类引用指向派生类
如果A类中定义有虚函数,并且在B类中重写了这个虚函数,就可以通过aRef产生多态效果。
引用的一个重要作用就是作为函数的参数类型。C/C++的函数参数是传值的,如果有大对象(例如一个大的结构)需要作为参数传递的时候,以前的(C语言中)方案往往是指针,因为这样可以避免将整个对象全部压栈,可以提高程序的效率。但是现在(C++中)又增加了一种同样有效率的选择,就是引用。
与指针类型的参数一样,引用不论指向什么类型的对象,作为参数传递的时候都是只压栈4个字节(在32位机上)。引用所占用的4字节大小是根据编译器产生的代码判断的,因为sizeof(a_reference)只能得到它所指向对象的大小。
引用型参数应该在能被定义为const的情况下,尽量定义为const,这不光是让代码更健壮,也有些其它方面的需要,例如,假设有如下函数声明:
string foo();
void bar(string & s);
那么下面的表达式将是非法的:
bar(foo());
bar("hello world");
原因在于foo()和"hello world"串都会产生一个临时对象,而在C++中,这些临时对象都是const类型的。因此上面的表达式就是试图将一个const类型的对象转换为非const类型,这是非法的。
引用作为返回值的时候,有一些规则必须遵守。这些规则包括:
另外,引用也常常与一些操作符的重载相关:
在另外的一些操作符中,却千万不能返回引用:
现在可以总结一下什么时候使用引用这个问题了。首先我们要看看什么时候必须使用引用:
其它下面的情况都是推荐使用引用,但是也可以不使用引用。如果不想使用引用,完全可以使用指针或者其它类似的东西替代:
另外一些情况下,不能返回引用:
4.参考资料
[1] Effective C++: Scott Meyers
相关视频
相关阅读 Windows错误代码大全 Windows错误代码查询激活windows有什么用Mac QQ和Windows QQ聊天记录怎么合并 Mac QQ和Windows QQ聊天记录Windows 10自动更新怎么关闭 如何关闭Windows 10自动更新windows 10 rs4快速预览版17017下载错误问题Win10秋季创意者更新16291更新了什么 win10 16291更新内容windows10秋季创意者更新时间 windows10秋季创意者更新内容kb3150513补丁更新了什么 Windows 10补丁kb3150513是什么
热门文章 360快剪辑怎么使用 36金山词霸如何屏幕取词百度收购PPS已敲定!3
最新文章
微信3.6.0测试版更新了微信支付漏洞会造成哪
360快剪辑怎么使用 360快剪辑软件使用方法介酷骑单车是什么 酷骑单车有什么用Apple pay与支付宝有什么区别 Apple pay与贝贝特卖是正品吗 贝贝特卖网可靠吗
人气排行 xp系统停止服务怎么办?xp系统升级win7系统方电脑闹钟怎么设置 win7电脑闹钟怎么设置office2013安装教程图解:手把手教你安装与qq影音闪退怎么办 QQ影音闪退解决方法VeryCD镜像网站逐个数,电驴资料库全集同步推是什么?同步推使用方法介绍QQ2012什么时候出 最新版下载EDiary——一款好用的电子日记本
查看所有0条评论>>