2010-02-24 41 views
1

我剛學C++,以及從C來,一些函數調用我看到這本書讓我困惑:C++函數取值,他們應該採取引用

char a; 
cin.get(a); 

在C,這不可能工作,如果你這樣做,將無法獲得輸出,因爲你是通過價值傳遞,而不是通過引用,爲什麼這在C++中工作?引用和取消引用使得隱式(編譯器知道cin.get需要一個指針,所以它被引用)?

+1

C沒有引用,只有值。 C++有實際的引用,別名到另一個實例。 – GManNickG 2010-02-24 04:19:37

+0

然後,一元&運算符的名稱是什麼?我認爲這是參考運營商。 – 2010-02-24 04:25:52

+2

&in C表示「地址」。在C++中,&意味着「地址」(如果在變量前面使用)或「引用」(如果在參數中鍵入後使用)。 – LeopardSkinPillBoxHat 2010-02-24 04:39:37

回答

11

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 
4

引用類型就像那樣工作(通過引用傳遞,而不是按值傳遞)。它類似於在C中傳遞一個指針(通過指針傳遞),但具有更好的語法和更安全(編譯時檢查)。該實現在內部通過指針傳遞。

+1

+1。在C中,* *會像在scanf(「%c」,&a)中一樣使用cin.get(&a),這是通過指針傳遞的。 – 2010-02-24 04:18:30

+1

如果我沒有弄錯,不需要將引用實現爲指針,儘管它們通常是。 – Eric 2010-02-24 04:19:13

+0

不需要,但AFAIK所有實現都是這樣做的(對於函數調用,無論如何)。 – Tronic 2010-02-24 04:19:55

1

C++允許通過引用傳遞(注意&,這表示一個參考時):

void foo(char& bar) { 
    bar = 42; 
} 

int main() { 
    char a; 
    foo(a); 
    // a == 42 here 
} 
1

這就是爲什麼一些C++程序員不喜歡用這樣的引用。
它看起來像一個函數的爭論 - 你不知道'a'是否被修改的語法。

首選傳遞const引用(當你有一個大的對象和一個副本會很昂貴),並返回引用或最好的傳遞指針。

+0

-1,因爲通過參數返回是完全有效和良好的風格(和有經驗的C++程序員,包括標準委員會)。 – Tronic 2010-02-24 04:37:25

+0

@Martin - 當一個方法需要返回多個值時,這不起作用。 – LeopardSkinPillBoxHat 2010-02-24 04:40:47

+1

返回引用可能會引起麻煩,因爲調用方無法控制返回引用引用的對象的生存期。特別是,如果你返回一個堆棧對象的引用,你的調用者將會有很多悲傷:) – 2010-02-24 04:42:14