2017-09-19 68 views
0

我是C++新手,現在通過參考學習調用。爲什麼我們必須將值而不是地址傳遞給C++中的「通過引用調用」函數?

我得知這個代碼塊在我的材料:

void callByRef(&a, &b); 

int main(){ 
    int k = 12; 
    int m = 4; 
    callByRef(k, m) //QUESTION HERE 
    return 0; 
} 

void callByRef(&a, &b){ 
    a += 3; 
    b -= 2; 
    return; 
} 

所以我的問題是宣告callByRef時,我們使用的a和b的地址作爲參數,所以當我們調用callByRef爲主,爲什麼我們需要通過(k,m)而不是(& k,& m)?

這是基本的,但我只是想爲我未來的學習找到合適的圖片。 謝謝你們!

+2

「我們使用a和b的地址作爲參數」什麼?該聲明應該看起來像'void callByRef(int&a,int&b)',這就是__not__獲取參數的地址,它聲明它們爲引用。 – tkausl

+1

'void callByRef(&a,&b)'[不是合法的C++](https://ideone.com/dpTUvj)。如果這是您的課程材料包含的內容,您應該抱怨並要求退款。 –

回答

0

callByRef()函數將引用作爲參數傳遞,因此不需要將顯式引用發送給該函數。請仔細閱讀,以便更好地理解。

Tutorial

+0

感謝您的回答hahahakebab!現在閱讀。 – Hang

2

&a操作裝置變量a的地址,的*a操作裝置的存儲器由變量a尋址的內容。現在,函數定義以下:

void callByRef(int &a, int &b){ 
    a += 3; 
    b -= 2; 
    return; 
} 

其中int &a意味着一個將是一個reference int類型的一些變量。因此,無論何時您要調用函數,都需要傳遞變量本身而不是其地址,因此callByRef(a, b)而不是callByRef(&a, &b)

此類聲明的原因如下,傳遞給函數的參數傳遞給值,即變量的內容被字面複製到函數變量中,因此函數內部的任何變化都不會產生任何影響。例如:

void callByVal(int a, int b){ 
    a += 3; 
    b -= 2; 
    return; 
} 

並具有:

x = 5; 
y = 10; 

主叫callByVal(x, y)不會對x和y的任何影響。爲了克服這一點,你需要按引用或int &a或者你可以通過指針和直接更新內存的替代來傳遞參數:

void callByPtr(int *a, int *b){ 
    *a += 3; 
    *b -= 2; 
    return; 
} 

現在它是有意義的傳遞變量的地址,例如callByPtr(&a, &b)

0

您不通過價值。 C++中的引用不完全像指針。把它們當作一個物體的另一個名字。

當然你需要這個名字綁定到一個對象以便引用來引用它。因此,例如當我們編寫int &i = k;時,我們說的是已經命名爲k的變量可能被稱爲i。要綁定參考,我們需要名稱另一個對象。而對象的名稱是k,而不是&k

這同樣適用於函數參數和參數。指定功能callByRef對兩個對象進行操作,它將調用ab。當您調用該功能時,您必須名稱它將引用的原始對象。原始對象被命名爲km,而不是&k&m

相關問題