引用形式
C++中的引用形式如下:
int a=0;
int & ra=a;
即:类型名 & 引用名 = 引用的变量;
这里就定义了一个变量a的一个引用ra。对ra进行的任何操作都与对a做的任何操作所等价。相当于ra是a的别名。如:
ra = 100;
cout<<a<<endl;
>>>100
注意事项
- 引用必须初始化,即定义引用时必须指明引用的变量。不初始化会报错:
int & ra;
>>>[Error] 'ra' declared as reference but not initialized
- 引用不能更改所引用的对象。如:
int a = 0;
int b = 10;
int & ra = a;
int & ra = b;
>>>[Error] redeclaration.重复声明
& ra =b;
>>>[Error] lvalue required as left operand of assignment.等号左边应为变量而非表达式,编译器认为此处的&是取址符
ra = b; //正确,但这个是赋值操作
- 显然,
int & ra =a;中的&只是一种标识符,而非取址符。 - 引用对象只能是变量,不能是常量。也就是说,只能通过变量初始化引用。如:
const int a = 0;
int & ra = a;
>>>[Error] invalid initialization of reference of type 'int&' from expression of type 'const int'
引用与指针
通过上述描述,可以看出,引用与指针似乎具有很多相似之处。通过引用可以对所引用的变量直接进行操作,通过指针同样可以达到该目的。
再分析引用与指针的关系前,我们先搞清楚“常量指针”与“指针常量”这两个概念。
常量指针与指针常量
这是一个看着就很晕的东西,但其实应该是英译中过程中出现的问题。而且不同的地方有时翻译的刚好相反。这里采用最大众的一种。
我们知道,C\C++中的常量是通过const关键字定义的,指针是通过类型名 * 指针名定义的。将二者结合,就会出现一下几种:
const int a;
int const a;
int * p;
const int *p;
int cosnt *p;
int * const p;
const int * const p;
int const * const p;
我们按顺序讲起。
-
const int a;与int const a;都是通过const定义的int类型常量,无法修改其值。 -
int *p;是一个指向int类型变量的指针,可以通过*p改变所指变量的值,也可以指向别处。 -
const int *p;与int const *p;相同,都是常量指针。可以指向int或const int等数据类型。常量指针const修饰的是指针p所指内容。就是说,指针p可以指向别处,所指变量若不是const也可以通过直接赋值改变其值,但不可以通过常量指针改变所指变量的值。如:
int a = 0;
int A = 0;
const int * p = &a;
p = &A; //常量指针可以指向别处
a = 100; //a是常量指针所指的int类型变量,可以赋值
*p = 100; //[Error] assignment of read-only location '* p'. 不能通过常量指针改变其所指变量
-
int * const p;是一个指针常量。可以通过指针常量对所指变量进行赋值,但不能使指针常量指向其他变量。如:
int a = 0;
int A = 0;
int * const p = &a;
p = &A; //[Error] assignment of read-only variable 'p'. 指针常量不能指向其他位置
a = 100; //a可以赋值改变
*p = 100; //可以通过指针常量改变其所指变量
-
const int * const p;与int const * const p;相同,都是指向常量的指针常量。他们只能指向const int类型,不能指向int类型。既不能通过指针改变所指常量值,也不能使指针指向其他变量。可谓双重read-only。
引用的指针实现
在弄清楚常量指针与指针常量后,我们对应着引用的特点,可以发现——引用就是一种指针常量。
对比如下两段代码:
先不对比了,明天再写,先发了充数。下面也是,明天再写。