C++的引用
C++:引用就是一个变量的别名
一、什么是引用
引用是C++在C的基础上新添加的一类数据类型,他的优点是既保留了C语言中指针操作的高效性,又弥补了指针直接操作内存可能带来的安全性问题。
1.1声明方法
**数据类型标识符 & 引用变量名 =被引用变量名;*
int a ;
int & b=a; //定义一个引用变量b引用的的对象是a
说明:
1、&在c++中不仅指取地址,还有引用变量的标识符。
2、为了保证使用引用的安全性,引用变量不可以被取地址,不同于*指针的方式引用无法进行指针似的偏移从而保证无法通过引用来直接修改内存
3、声明引用类型变量时必须对其进行初始化,一旦初始化后引用变量与被引用变量间的关系不可被更改,即不允许引用变量再次绑定其他变量。
4、引用实际上就是给被引用变量起了一个别名,通过操作引用可以实现对被引用变量的读写。
5、不能建立一个数组的引用,因为数组是一个由若干元素构成的集合,所以无法建立一个数组的别名。
1.2为什么C++要加入引用类型的变量,引用类型与指针类型的比较
引用类型与指针类型的比较
引用类型既保留了指针在函数传递参数时的高效性,引用变量又因为不能被访问地址从而不能进行偏移保证了访问地址的绝对安全。
使用时的直接区别
一、指针可以为null,引用变量必须在定义时被初始化
二、引用变量与被引用变量一旦绑定就无法在修改,而指针可以
二、引用变量的实际应用
2.1引用变量作为函数形参声明
函数名(参数数据类型 & 引用形参)
void swapr(int & a,int & b);
二、引用类型在函数中的实际使用
引用类型在函数中传递的作用可以==指针的作用,但应用变量不需要额外加上取内容的标识符*,看起来更加的简洁。
void swapr(int & a,int & b)//实现传入实参值交换
{
int temp = a; //临时变量保存a
a=b; //相比*a=*b的指针方式看起来更直观简洁
b=temp;
return 0;
}
2.1传参数时特殊情况——临时变量
我们在调用函数时,往往传入的不是一个直接的变量名,而是一个值的表达式,如下面这种情况。
int x,y;
swapr(X+3,y+5);
这时由于引用变量只能接受一个变量,故C++设计了一个临时变量用来先保存表达式的值,再将该临时变量交给引用变量引用。值得注意的是临时变量的数据类型是const的,因此在函数的声明与定义中也要进行相应的修改。
void swapr(const int & a,const int & b); //声明与定义都要改为常引用
三、引用的更多使用
3.1 常引用
变量可以使变量和常量,别名本质上也是变量,也可以是变量或者是常量,所以对应起来有四种情况,分别如下:
(1)变引用——变量
int a = 10; //可读可写
int& r = a; //可读可写
(2)常引用——变量
int a = 10;
int const& r = a;
ra=20;
(3)变引用——常量
int const a = 100;
int & r = a;
(4)常引用——常量
int const a = 100;
int const & r = a;
3.2 指针引用
引用既然就是一个变量,那我同样也可以给指针变量去一个别名啊,参见下面的
int main()
{
int a = 100;
int *p = &a;
int * &rp = p;
cout << a << endl;
cout << *p << endl;
cout << *rp << endl; //这里将*放在前面,因为p的类型是 int * 作为一个整体!!
cout << p << endl;
cout << rp << endl;
getchar();
return 0;
}
/*
100
100
100
012FF84C
012FF84C
*/
我们发现这里的指针变量p和它的引用(别名)r是完全一样的。但是由于引用的目的跟指针的目的是类似的,所以一般不需要对指针再起别名了。
引用变量就是别名、别名、别名。