「但是,請等一下」,你懷疑地問,「這樣的**會產生什麼樣的後果?」
char *pc = 0;// 設定指標為空值
char& rc = *pc;// 讓引用指向空值
這是非常有害的,毫無疑問。結果將是不確定的(編譯器能產生一些輸出,導致任何事情都有可能發生)。
因為引用肯定會指向乙個物件,引用應被初始化。
string& rs;// 錯誤,引用必須被初始化
string *ps;// 指標沒有這樣的限制,未初始化的指標,合法但危險
string s("xyzzy");
string& rs = s;// 正確,rs是s的引用
不存在指向空值的引用這個事實意味著使用引用的**效率比使用指標的要高。因為在使用引用之前不需要測試它的合法性。
void printdouble(const double& rd)
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 沒有改變
在以下情況下你應該使用指標:
還有一種情況,就是當你過載某個操作符時,你應該使用引用。最普通的例子是操作符.這個操作符典型的用法是返回乙個目標物件,其能被賦值。
vectorv(10); // 建立整形向量(vector),大小為10;
v[5] = 10; // 這個被賦值的目標物件就是操作符返回的值
//如果操作符返回乙個指標,那麼後乙個語句就得這樣寫:
*v[5] = 10;
但是這樣會使得v看上去象是乙個向量指標。因此你會選擇讓操作符返回乙個引用。
當你知道你必須指向乙個物件並且不想改變其指向時,或者在過載操作符並為防止不必要的語義誤解時,你不應該使用指標。而在除此之外的其他情況下,則應使用指標
假設你有
void func(int* p, int& r);
int a = 1;
int b = 1;
func(&a,b);
指標本身的值(位址值)是以pass by value進行的,你能改變位址值,但這並不會改變指標所指向的變數的值
p = someotherpointer;//a is still 1
但能用指標來改變指標所指向的變數的值
*p = 123131; // a now is 123131
引用本身是以pass by reference進行的,改變其值即改變引用所對應的變數的值
r = 1231;// b now is 1231
盡可能使用引用,不得已時使用指標。
當你不需要「重新指向」時,引用一般優先於指標被選用。這通常意味著引用用於類的公有介面時更有用。引用出現的典型場合是物件的表面,而指標用於物件內部。
什麼時候需要使用引用?
程式設計師能夠修改呼叫函式中的資料物件
通過傳遞引用而不是整個資料物件,可以提高程式的執行速度。
當資料物件較大時(如結構和類物件),第二個原因最重要,這些也是使用指標引數的原因。這是有道理的,因為引用引數實際上是基於指標的**的另乙個介面。
何時使用引用引數
節選自己c primer plus 5 使用引用引數的主要原因有兩個 1.程式設計師能夠修改呼叫函式中的資料物件 2.通過傳遞引用而不是整個資料物件,可以提高程式的執行速度 當資料物件較大時 結構和類物件 第二個原因最重要。這些也是使用指標引數的原因。這是有道理的,因為引用引數實際上是基於指標的 的...
何時使用指標引數 引用引數 按值傳遞?
1 什麼是引用?如何使用引用?為什麼要使用引用?1 什麼是引用?引用變數是一種偽裝指標,它允許為變數建立別名 另乙個名稱 在初始化乙個引用變數時,必須對其進行初始化。2 何時使用引用?引用變數主要被用作處理結構和類物件的函式的引數。3 為什麼要使用引用?4 返回引用時的注意事項 2 什麼時候應使用引...
指標和引用,const 指標和const 引用
指標和引用是在使用中經常弄混淆的兩個概念。引用 reference 為物件起了另外乙個名字,用符號 表示。name,例如 int i 1024 int ref i 一般在初始化變數時,初始值會被拷貝到新建立的物件中,然而定義引用時,程式把引用和它的初始值繫結 bind 在一起,而不是將初始值拷貝給引...