指標用操作符 和 ,引用使用操作符

2021-06-28 19:33:59 字數 1746 閱讀 6630

指標與引用看上去完全不同(指標用操作符』*』和』->』,引用使用操作符』.』),但是它們似乎有相同的功能。指標與引用都是讓你間接引用其他物件。你如何決定在什麼時候使用指標,在什麼時候使用引用呢?

首先,要認識到在任何情況下都不能用指向空值的引用。乙個引用必須總是指向某些物件。因此如果你使用乙個變數並讓它指向乙個物件,但是該變數在某些時候也可能不指向任何物件,這時你應該把變數宣告為指標,因為這樣你可以賦空值給該變數。相反,如果變數肯定指向乙個物件,例如你的設計不允許變數為空,這時你就可以把變數宣告為引用。

「但是,請等一下」,你懷疑地問,「這樣的**會產生什麼樣的後果?」

char *pc = 0; // 設定指標為空值

char& rc = *pc; // 讓引用指向空值

這是非常有害的,毫無疑問。結果將是不確定的(編譯器能產生一些輸出,導致任何事情都有可能發生),應該躲開寫出這樣**的人除非他們同意改正錯誤。如果你擔心這樣的**會出現在你的軟體裡,那麼你最好完全避免使用引用,要不然就去讓更優秀的程式設計師去做。我們以後將忽略乙個引用指向空值的可能性。

因為引用肯定會指向乙個物件,在c裡,引用應被初始化。

string& rs; // 錯誤,引用必須被初始化

string s("xyzzy");

string& rs = s; // 正確,rs指向s

指標沒有這樣的限制。

string *ps; // 未初始化的指標

// 合法但危險

不存在指向空值的引用這個事實意味著使用引用的**效率比使用指標的要高。因為在使用引用之前不需要測試它的合法性。

void printdouble(const double& rd)

// 肯定指向乙個double值

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

void printdouble(const double *pd)}

指標與引用的另乙個重要的不同是指標可以被重新賦值以指向另乙個不同的物件。但是引用則總是指向在初始化時被指定的物件,以後不能改變。

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 沒有改變

總的來說,在以下情況下你應該使用指標,一是你考慮到存在不指向任何物件的可能(在這種情況下,你能夠設定指標為空),二是你需要能夠在不同的時刻指向不同的物件(在這種情況下,你能改變指標的指向)。如果總是指向乙個物件並且一旦指向乙個物件後就不會改變指向,那麼你應該使用引用。

還有一種情況,就是當你過載某個操作符時,你應該使用引用。最普通的例子是操作符。這個操作符典型的用法是返回乙個目標物件,其能被賦值。

vector v(10); // 建立整形向量(vector),大小為10;

// 向量是乙個在標準c庫中的乙個模板

v[5] = 10; // 這個被賦值的目標物件就是操作符返回的值

如果操作符返回乙個指標,那麼後乙個語句就得這樣寫:

*v[5] = 10;

但是這樣會使得v看上去象是乙個向量指標。因此你會選擇讓操作符返回乙個引用。

當你知道你必須指向乙個物件並且不想改變其指向時,或者在過載操作符並為防止不必要的語義誤解時,你不應該使用指標。而在除此之外的其他情況下,則應使用指標。

前置操作符和後置操作符

操作符可以被過載 全域性函式和成員函式均可以進行過載 過載前置 操作符不需要額外的引數 過載後置 操作符需要乙個int型別的佔位引數 來看乙個例子 include include using namespace std class test intvalue test operator test o...

關係操作符和邏輯操作符

關係操作符和邏輯操作符使用算術或指標型別的運算元,並返回bool 型別的值。操作符功能用法 logical not 邏輯非 expr less than 小於 expr expr less than or equal 小於等於 expr expr greater than 大於 expr expr ...

MySQL的and操作符和or操作符

有時對where的要篩選的列不止乙個時,那麼就用到了and操作符和or操作符,and操作符顧名思義的意思是 並且 而or操作符的意思是 或者 比如以部門員工表為例 查詢部門編號為d001並且入職日期為 1985 02 02的員工編號,那麼就要用到and操作符 那如果是查詢部門編號為d001或者入職日...