2012-01-19 79 views
6

我有一個引用問題。 考慮以下代碼:作爲函數參數的引用?

void pseudo_increase(int a){a++;} 
int main(){ 
    int a = 0; 
    //.. 
    pseudo_increase(a); 
    //.. 
} 

這裏,變量a的價值不會隨着克隆或它的複製品被傳遞,而不是變量本身。
現在讓我們考慮的另外一個例子:

void true_increase(int& a){a++;} 
int main(){ 
    int a = 0; 
    //.. 
    true_increase(a); 
    //.. 
} 

這是說的a值將增加 - 但爲什麼呢?

true_increase(a)被調用時,a的副本將被傳遞。這將是一個不同的變量。因此&a將與a的真實地址不同。那麼a的價值如何增加?

糾正我錯在哪裏。

+1

您應該爲函數參數和傳遞給它的變量使用不同的標識符,這樣您就不會再陷入困惑。 – AusCBloke

+1

按引用傳遞不會創建副本。它是對同一個變量的引用。 – jweyrich

+0

我建議您首先了解指針,然後介紹如何引用可以減少未初始化對象和無效指針等的痛苦。選擇您最喜愛的C/C++書籍! – sarat

回答

6

考慮下面的例子:

int a = 1; 
int &b = a; 
b = 2; // this will set a to 2 
printf("a = %d\n", a); //output: a = 2 

b這裏可以像一個別名a處理。無論您分配給b,也將分配給a(因爲b是對a的參考)。傳遞參數by reference沒有什麼不同:

void foo(int &b) 
{ 
    b = 2; 
} 

int main() 
{ 
    int a = 1; 
    foo(a); 
    printf("a = %d\n", a); //output: a = 2 
    return 0; 
} 
5

當true_increase(一)被調用,複製 'A' 將被傳遞

這就是你錯了。將提到a。這就是&用於旁邊的參數類型。引用發生的任何操作都會應用於指示對象。

1

在true_increase(INT &一)功能,什麼裏面的代碼也越來越不是你所指定的整數值的副本。它是對您的整數值駐留在計算機內存中的相同內存位置的引用。因此,通過該引用完成的任何更改都會發生在您最初聲明的實際整數上,而不是它的副本。因此,當函數返回時,通過引用對變量所做的任何更改都會反映到原始變量本身中。這是在C++中通過引用傳遞值的概念。

在第一種情況下,正如您所提到的那樣,使用了原始變量的副本,因此無論您在函數內部做了什麼,都不會反映到原始變量中。