天天看點

1 指針和引用的差別

  • 任何情況下都不能使用指向空值的引用。
char* pc = 0;//設定指針為空值
char& rc = *pc;//讓引用指向空值
           
  • 引用必須被初始化。
string& rs;//引用必須被初始化
string s("xyz");
string& rs = s;//正确,rs指向s
sting *ps; //未初始化的指針合法單危險
           

不存在指向空值的引用這個事實意味着使用引用的代碼效率比使用指針要高,因為在使用引用之前不需要檢查它的合法性:

void printDouble(const double& rd)
{
cout << rd;//不需要測試rd,它肯定是一個指向double的值
}
           

相反指針則總是被測試,防止其為空:

void printDouble(const double* pd)
{
if(pd) //檢查是否為空
{
cout << rd;
}

}
           
  • 指針可以被重新指派以指向另外一個不同的對象,但是引用則總是指向在初始化就指定的對象,以後不能改變。
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
           

總體來說,在以下情況下應該使用指針,一是你考慮存在不指向任何對象的可能(在這種情況下,你能夠設定指針為空),二是你需要能夠在不同的時候指向不同的對象(在這種情況下,你能改變指針的指向)。如果總是指向一個對象并且一旦指向一個對象後就不會改變指向,那麼你應該使用引用。 還有一種情況下,就是當你重載某個操作符的時候,你應該使用引用。 當你知道你必須指向一個對象并且不改變其指向的時候,或者重載操作符并且防止不必要的語意誤解時,你不應該使用指針。而在除此之外的其他情況下,則應該使用指針。

繼續閱讀