指針和引用看上去完全不同(指針用操作符 * 和 ->, 而指針用操作符 &),但是他們似乎都有相同的功能,都能讓你間接引用其他對象。使用指針的和引用的時機是什麼時候呢?
首先,要認識到任何時候下引用都不能指向空值的引用,一個引用必須指向某個對象。
指針可以指向任何對象,也可以指向空值。
char* pc = 0; // 設置指針爲空值
char& rc = *pc; // 讓引用指向空值
上面的示例是非常危險的,結果將不確定。因爲在 C++ 裏引用必須初始化指向一個對象。
string &rs; // 錯誤
string str("aaa");
string &rs = str; // 正確
string* ps; // 未初始化的指針,合法單危險。
不存在指向空值的引用這個事實意味着使用引用的代碼效率比使用指針的要高,因爲在使用引用之前不需要校驗他的合法性。相反,指針應該總是被測試,防止其爲空。
其次,指針和引用的另外一個重要的不同是,指針可以被重新賦值執行另外一個對象,引用總是指向初始化時被指定的對象,以後不能改變。
string s1("hello"); string s2("word"); string& rs = s1; // rs 引用 s1 string* ps = &s1; // ps 指向 s1 rs = s2; // rs 仍然引用s1,s1 的值修改爲 word ps =&s2; //ps 現在指向s2,s1 沒有改變
綜上所述:
1、你考慮到存在不指向任何對象的可能時,不能使用引用,需要使用指針;
2、能夠在不同的時刻指向不同的對象,不能使用引用,需要使用指針;
3、當你知道你必須指向一個對象並且不想改變指向時,或者在重載操作符併爲防止不必要的語義誤解時,需要是使用引用。