引用和指針的區別

引用(references)使用“.”操作符,指針(pointers)使用“*”和“->”操作符,這是兩者最基本也是最熟悉的區別了,應該不用詳說。

首先,沒有所謂的null reference。一個reference必須總代表某個對象,因此C++要求references必須有初值

string& rs;//錯誤!references必須被初始化

string s("xyzzy");

string& rs = s;//沒問題,rs指向s

但是pointers就沒有這樣的限制,儘管有很大的風險:

string* ps;//未初始化的指針,有效,但風險高

雖然C++沒有這樣的限制,但是我們在聲明一個指針的時候也最好要初始化,避免出現野指針。

下面這種情況也是不被允許的,要禁忌:

char* pc = 0;//將pointer設定爲null

char& rc = *pc;//讓references代表null pointer的解引值

這是有害的行爲,其結果不可預測(C++)對此沒有定義,編譯器可以產生任何可能的輸出。所以,

我們要永遠不再考慮“reference稱爲null“的可能性。

上面的事實意味着使用reference可能會比使用pointer更富效率。這是因爲使用reference之前不需要測試其有效性:

void printDouble(const duble& rd)

{

     cout << rd;//不需要測試rd,它一定代表某個double

}

void printDouble(const double* pd)

{

   if (pd)//檢查是否爲null pointer

   {

          cout << *pd;

   }

}

其次,pointers和references之間的另一個重要的差異就是,pointers可以被重新賦值,指向另一個對象,references卻總是指向(代表)它最初獲得的那個對象:

string s1("Nancy");

string s2("Clancy");

string& rs = s1;//rs代表s1

string* ps = &s1;//ps代表s1

rs = s2;//rs仍然代表s1,但是s1的值現在變成了”Clancy“

ps = &s2;//ps現在指向s2,s1沒有變化

還有其他情況也需要使用references,例如當你實現某些操作符的時候,最常見的例子就是operator[]。這個操作符很特別地必須返回某種”能顧被當做assignment賦值對象“的東西:

vector<int> v(10);//產生一個int vector,大小爲10

v[5] = 10;//assignment的賦值對象是operator[]的返回值

因此,當知道需要指向某個東西,而且絕不會改變指向其他東西,或是當你實現一個操作符而其語法需求無法由pointers達成,你就應該選擇references。任何其他時候,請採用pointers。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章