《Thinking in C++》中解釋:
引用(&)像是一個能編譯器逆向引用的常量型指標。通常用於函數的參
數表中和函數的傳回值,也可以獨立使用。例如:
int x;
int &r = x;
當建立一個引用時,引用必須被初始化指向一個存在的對象,但也可以:
int &q = 12;
這裡,編譯器指派了一個儲存單元,它的初值初始化為12。引用必須和儲存單元聯
系,訪問引用時,就是訪問那個儲存單元。如:
int x = 0;
int &a = x;
a++;
事實上就是增加x。考慮引用最簡單的方法是把它當作是一個奇特的指標,這個指
針的優點是不必懷疑它是否被初始化了(編譯器強迫它初始化),也不必知道怎麼樣
對他逆向引用(這由編譯器做)。
使用引用時有一定的規則:
■ 當引用被建立時,必須初始化。(指標則可以在任何時候被初始化)
■ 一旦一個引用被初始化為指向一個對象,它就不能被改變為對另一個對象的引
用。(指標可以在任何時候指向另一個對象)
■ 不可能有NULL應用,必須保證引用和一塊合法的儲存單元關聯。
函數中的引用:
最常看見的引用的地方是函數參數和傳回值中,當引用被用做函數參數時,函數內任何對該引用的改變將對函數外的參數改變。如果函數中返回一個引用,必須象從函數種返回一個指標一樣對待。
指標引用:
在C語言中,如果想改變指標本身而不是它所指向的內容,函式宣告可能像這樣:
void fun(int**);
傳遞它時,必須是指標的地址:
int l = 47;
int *p = &l;
fun(&p);
對於C++中的引用,文法清晰多了,函數參數變成指標的引用,用不著取得指標的地址。
#include <iostream.h>
void increment(int*& i) { i++;}
main()
{
int *i = 0;
cout<<“i=”<< i << endl;
increment(i);
cout<<“i=”<< i << endl;
}