我剛學C++,以及從C來,一些函數調用我看到這本書讓我困惑:C++函數取值,他們應該採取引用
char a;
cin.get(a);
在C,這不可能工作,如果你這樣做,將無法獲得輸出,因爲你是通過價值傳遞,而不是通過引用,爲什麼這在C++中工作?引用和取消引用使得隱式(編譯器知道cin.get需要一個指針,所以它被引用)?
我剛學C++,以及從C來,一些函數調用我看到這本書讓我困惑:C++函數取值,他們應該採取引用
char a;
cin.get(a);
在C,這不可能工作,如果你這樣做,將無法獲得輸出,因爲你是通過價值傳遞,而不是通過引用,爲什麼這在C++中工作?引用和取消引用使得隱式(編譯器知道cin.get需要一個指針,所以它被引用)?
C++
這將用C工作++因爲get()
函數簽名可能是這樣的:
void get(char& a); // pass-by-reference
的&
符號0123後表示編譯器比當您傳遞值爲char
時,它應該將引用傳遞給char
而不是複製它。
這實質上意味着在get()
內所做的任何更改都將反映在方法之外的值a
中。
如果get()
函數簽名是這樣的:
void get(char a); // pass-by-value
然後a
將由值,這意味着a
副本被傳遞被傳遞到方法作爲參數之前進行。對a
所做的任何更改只會是本地方法,並在方法返回時丟失。
Ç
之所以這將不是在C工作,是因爲C只有通按值。只有這樣,才能模擬通按引用用C行爲是通過值傳遞它的指針,然後去參考指針值(從而訪問同一存儲器位置)修改所述方法內的值時:
void get(char* a)
{
*a = 'g';
}
int main(int argc, char* argv[])
{
char a = 'f';
get(&a);
printf("%c\n", a);
return 0;
}
運行此程序將輸出:
g
C++允許通過引用傳遞(注意&
,這表示一個參考時):
void foo(char& bar) {
bar = 42;
}
int main() {
char a;
foo(a);
// a == 42 here
}
這就是爲什麼一些C++程序員不喜歡用這樣的引用。
它看起來像一個函數的爭論 - 你不知道'a'是否被修改的語法。
首選傳遞const引用(當你有一個大的對象和一個副本會很昂貴),並返回引用或最好的傳遞指針。
-1,因爲通過參數返回是完全有效和良好的風格(和有經驗的C++程序員,包括標準委員會)。 – Tronic 2010-02-24 04:37:25
@Martin - 當一個方法需要返回多個值時,這不起作用。 – LeopardSkinPillBoxHat 2010-02-24 04:40:47
返回引用可能會引起麻煩,因爲調用方無法控制返回引用引用的對象的生存期。特別是,如果你返回一個堆棧對象的引用,你的調用者將會有很多悲傷:) – 2010-02-24 04:42:14
C沒有引用,只有值。 C++有實際的引用,別名到另一個實例。 – GManNickG 2010-02-24 04:19:37
然後,一元&運算符的名稱是什麼?我認爲這是參考運營商。 – 2010-02-24 04:25:52
&in C表示「地址」。在C++中,&意味着「地址」(如果在變量前面使用)或「引用」(如果在參數中鍵入後使用)。 – LeopardSkinPillBoxHat 2010-02-24 04:39:37