在C++中,還有一個引用的概念。引用就是一個變量的別名,它需要用另一個變量或對象來初始化自身。引用就像一個人的外號一樣,例如:有一個人,他的名字叫做張旭,因他在家排行老三,別人給他取了一個外號叫張三,這樣,我們叫張三或張旭,指的都是同一個人。下面的代碼聲明了一個引用b,並用變量a進行了初始化。
int a = 5;
int &b = a; //用&表示申明一個引用。引用必須在申明時進行初始化
考慮下面代碼:
int a = 5;
int &b = a;
int c=3; //此處並不是將b變成c的引用,而是給b賦值,此時,b和a的值都變成了3
引用和用來初始化引用的變量指向的是同一塊內存,因此通過引用或者變量可以改變同一塊內存中的內容。引用一旦初始化,它就代表了一塊特定的內存,再也不能代表其他的內存。
那麼引用和指針變量有什麼區別呢?
引用只是一個別名,是一個變量或對象的替換名稱。引用的地址沒有任何意義,因此C++沒有提供訪問引用本身地址的方法。引用的地址就是它所引用的變量或者對象的地址,對引用的地址所做的操作就是對被引用的變量或對象的地址所做的操作。指針是地址,指針變量要存儲地址值,因此要占用存儲空間,我們可以隨時修改指針變量所保存的地址值,從而指向其他的內存。
引用和指針變量的內存模型如圖2.15所示。
在編寫程序時,很少直接使用引用,即用一個變量來初始化一個引用(int a; int &b=a),如果這麼做,通過變量和引用都可以修改同一塊內存的內容,在程序中,就很容易出現問題,不知道此時內存中的值到底是多少了。
引用多數用在函數的形參定義上,在調用函數傳參時,我們經常使用指針傳遞,一是避免在實參占較大內存時發生值的復制,二是完成一些特殊的作用,例如,要在函數中修改實參所指向內存中的內容。同樣,使用引用作為函數的形參也能完成指針的功能,在有些情況下還能達到比使用指針更好的效果。
下面,我們以一段程序(如例2-23所示)的講解作為引用這一小節的結束。
例2-23
#include <iOStream.h>
//change函數主要用來交換a和b的值
void change(int& a,int& b);
void main()
{
int x=5;
int y=3;
cout<<"original x="<<x<<endl;
cout<<"original y="<<y<<endl;
change(x,y); //此處如果用指針傳遞,則調用change(&x, &y),這樣很容易讓人
迷惑,不知道交換的是x和y的值,還是x和y的地址?此處用引用,
可讀性就比指針要好
cout<<"changed x="<<x<<endl;
cout<<"changed y="<<y<<endl;
}
/*在change()函數的實現中,我們采用了一個小算法,完成了a和b值的交換,讀者下來可以仔細研讀,細細體味一下(讀者還可以采用其他的方法,當然也可以直接使用通常的實現,定義一個臨時變量,完成a和b值的交換)*/
void change(int& a,int& b)
{
a=a+b;
b=a-b;
a=a-b;
}