引用形式
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'
引用與指針
通過上述描述,可以看出,引用與指針似乎具有很多相似之處。通過引用可以對所引用的變量直接進行操作,通過指針同樣可以達到該目的。
再分析引用與指針的關系前,我們先搞清楚“常量指針”與“指針常量”這兩個概念。
常量指針與指針常量
這是一個看著就很暈的東西,但其實應該是英譯中過程中出現(xiàn)的問題。而且不同的地方有時翻譯的剛好相反。這里采用最大眾的一種。
我們知道,C\C++中的常量是通過const關鍵字定義的,指針是通過類型名 * 指針名定義的。將二者結合,就會出現(xiàn)一下幾種:
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;相同,都是常量指針??梢灾赶?code>int或const int等數(shù)據(jù)類型。常量指針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。
引用的指針實現(xiàn)
在弄清楚常量指針與指針常量后,我們對應著引用的特點,可以發(fā)現(xiàn)——引用就是一種指針常量。
對比如下兩段代碼:
先不對比了,明天再寫,先發(fā)了充數(shù)。下面也是,明天再寫。