引用的概念
引用是给已经存在的变量取了一个别名,并没有额外开辟空间
引用的格式如下
int a=1;
int& ra=a;
即 类型& 引用变量名=引用实体
注意,引用的类型必须和引用实体的类型是相同的
引用的特性
1.引用在定义时必须初始化
int& ra;
如上的代码就是错误的
2.一个变量可以有多个引用
int a=1;
int& x=a;
int& y=a;
3.引用一旦引用了一个实体,就不能再引用其他实体
int a=1;
int b=2;
int& x=a;
int& x=b;//错误
x=b;//将b的值赋给x(a)
引用常见错误
1.实体前有const,引用没有const
const int a=10;
int& ra=a;
如上的代码就是错误的,第二行代码放大了a的权限,原本只能读a,现在ra的引用既能读又能写
2.实体为常量,引用没加const
int& ra=10;
如上的错误代码中,10是常量,无法修改,而int类型能修改
3.引用类型与实体类型不同
double a=1.1;
int& ra=a;
如上的代码就是错误的,引用的类型必须与实体的类型一致
引用的应用场景
1.做参数
void Fun(int& a)
{
//...
}
如上,引用变量在函数Fun中作为参数
2.做返回值
int& Fun()
{
//...
}
如上,引用变量在函数Fun中作为返回值
需要注意的是,若出了函数作用域,返回的实体变量还给操作系统了,就必须使用传值返回,而不能传引用返回
int& Add(int x, int y)
{
int ret=x+y;
return ret;
}
如上就不能传引用返回
传值,传引用的效率比较
若传值,在传参和返回时,参数与返回值是值的一份临时拷贝,故传值效率相比于传引用,效率更低
引用和指针的区别
1.引用是一个变量的别名,而指针储存一个变量的地址
2.引用在定义时必须初始化,而指针没有要求
3.引用在定义后,就不能再引用其他实体变量,而指针可以改变储存的地址
4.没有NULL引用,但是有NULL指针
5.在sizeof中,引用的大小为引用类型的大小,而指针的大小为指针变量的大小(32位平台下4个字节)
6.引用自加则引用的实体自加,指针自加,则向后偏移一个类型的大小
7.没有多级引用,有多级指针
8.若想访问实体,引用编译器自己处理,指针需要显式解引用
9.引用比指针使用起来相对更安全
小结
作者全方位介绍了引用,包括引用的概念,是实体变量的别名,还有引用的一些特性,使用引用时会出现的错误,引用的应用场景,引用与传值在效率上的比较,引用和指针的区别。