用引用傳遞函式引數

2021-05-23 20:00:36 字數 1235 閱讀 4674

1.引用傳遞引數

傳遞引用給函式與傳遞指標的效果一樣,傳遞的是原來的變數或物件,而不是在函式作用域內建立變數或物件的副本。

在8.6節中,我們看到對swap(int,int)傳值方式函式的呼叫不影響呼叫函式中的實參,結果並未達到交換資料的預想目的。

使用指標傳遞方式的swap(int *,int *)函式的呼叫,能夠達到預定的目的(見8.6 節),但是函式的語法相對傳值方式來說比較累贅。首先,在swap()函式內需要重複遞引用(dereference)(*px),這容易產生錯誤且難於閱讀。其次,呼叫函式需要傳遞變數位址,使swap()內部的工作對使用者太過顯然。而且還有swap(&x,&y)的形式會造成一種交換兩個變數位址的錯覺。

c++的目標之一就是讓使用函式的使用者無須考慮函式是如何工作的。傳遞指標給使用函式的使用者增加了程式設計和理解的負擔,這些負擔本應屬於被呼叫函式。

例如,下面的程式用引用改寫swap()函式的定義及呼叫:

//*********************

//**   ch9_4.cpp  **

//*********************

#include

void swap(int &x,int &y);

void main()

執行結果為:

before swap,x:5,y:6

after swap,x:6,y:5

在主函式中,呼叫swap()函式的引數是x和y,簡單地傳遞變數而不是它們的位址。而事實上,傳遞的是它們的位址。引用傳遞的記憶體布局與指標相仿,只是操作完全不同。每當使用引用時, c++就去求該引用所含位址中的變數值,見圖9-4:

引用具有指標的威力,但是呼叫引用傳遞的函式時,可讀性卻比指標傳遞好。引用具有傳值方式函式呼叫語法的簡單性與可讀性,但是威力卻比傳值方式強。

2.引用存在的問題

儘管引用可以表達清晰並讓程式設計師負責了解如何傳遞引數,但是在有些情況下它們能隱藏錯誤。

例如,下面的**在沒有看到函式原型之前可能會誤認為實參a和b是通過值來傳遞的,從而不能通過函式呼叫來修改它,而事實上卻能夠修改:

int a=10;

int b=20;

swap(a,b);

因為引用隱藏了函式所使用的引數傳遞的型別,所以無法從所看到的函式呼叫判斷其是值傳遞還是引用傳遞。正因為此,下面的**中兩個過載函式將引起編譯報錯:

void fn(int s)

void fn(int&t)

void main()

c 傳遞函式引數

傳遞普通函式和類的成員函式方式不同,原因是傳遞函式引數實際傳的是函式的位址,但是普通函式和成員函式的位址獲取方式不太相同。普通函式只要傳遞乙個函式名稱即可,但是成員函式在類的內部中沒有位址,選擇乙個成員函式就意味著得知道該函式在類中的偏移量,因此需要知道該物件和對應的偏移量,才能得到真實的位址。當然...

R 引數傳遞函式 getopt

getopt 是getopt包的函式,需要先按照getopt包 getopt spec null,opt commandargs true command get rscript filename usage false,debug false spec 乙個4或5列的矩陣,裡面包括了引數資訊,前四...

物件間值傳遞,函式引數按值,引用傳遞 legend

一 如何在兩個類a和b中傳遞value?1 方法一 兩個類中都有這個要傳遞的value成員變數。均有getvalue setvalue 函式。從乙個類中getvalue 然後將value通過另乙個類的setvalue 就可以了 二 兩個類a和b如何共享乙個變數value?1 方法一 將需要共享的變數...