函式中實參到形參的傳遞

2021-07-25 08:54:32 字數 3292 閱讀 5464

引數的傳遞就是用實參初始化對應的形參。

非引用形參:

基本的情況:複製實參的值。函式並沒有訪問呼叫函式所傳遞的實參本身,所以不會改變實參的值。

void swap(int x, int y)  

int main()

指標形參:此時將複製實參的指標:形參的改變不會引起實參的改變,但是形參指向的內容可以發生變化。

void swap(int

*px, int

*py)

int main()

程式中,雖然pa始終指向a,pb始終指向b,但是a與b的值已發生了交換。

const形參:const實參可以傳遞給非const形參,因為初始化的複製規則:可以用const物件給非const物件複製

int plus(int x,int y)  

int main()

當然,使用const實參初始化const形參肯定是沒有問題的。

int plus(const

int x,const

int y)

int main()

反之,非const物件也可以傳遞給const形參,只要在程式中不改變形參的值即可:

int plus(const

int x,const

int y)

int main()

但是,如果你想在程式中修改形參的值,就會報錯:

int plus(const

int x,const

int y)

編譯無法通過。

複製實參的不適合的情況:

1.需要在函式中修改實參的值

2.沒有辦法實現引數的複製(比如陣列)

3.當使用大型物件作為引數傳遞時,複製物件付出的代價太大。

引用形參:

引用形參直接關聯到所繫結的物件,而非物件的副本。此時形參只是實參的另乙個名字,對形參的修改就意味著對實參的修改。

void swap(int &x,int &y)  

int main()

還有一種用處是返回額外的結果:還是只有乙個返回值,但是有時候我們想要更多的結果,可以通過引用來實現:

比如我們要遍歷乙個容器,希望從中找出值為某個特定值的位置以及出現次數。如果找到該元素,則返回該元素的位置,如果找到不止乙個,返回第一次出現的位置;如果沒有找到,則返回迭代器的end。

問題就出在這裡:如果既返回迭代器的位址,又返回出現次數呢?

#include 

#include

using

namespace

std;

vector

::const_iterator find_value(vector

::const_iterator beg, //起始位置

vector

::const_iterator end,//結束為止

int value, //要尋找的值

vector

::size_type &occurs) //出現次數

++occurs;

} }

return res_iter;

} int main()

const引用:

為什麼盡量使用const引用:因為這樣的話,可以給函式直接傳遞乙個右值:

比如,當你定義

bool findchar(const

string &s, const

char c)

時,你可以在程式中直接使用字串來呼叫函式

int main()  

而去掉const以後:

bool findchar( string  &s,  char c)  

bool flag = findchar("thefutureisours",'a');

就會報錯,你只能使用,

string

word = "thefutureisours";

bool flag = findchar(word,'a');

來呼叫函式了。

void printvaules(const

int a[10])

; printvaules(value);

return

0;

}

程式中,printvaules假定陣列有10個元素,但是如果陣列長度不為10,雖然程式能夠編譯並執行,但是第3個數以後的列印資訊卻不是我們希望的。

由此可見,非引用陣列的形參只會檢查實參與形參的陣列具有相同的型別,而不會檢查陣列中的個數是否匹配。

如果使用的是引用陣列,則編譯器會檢查形參中陣列的元素個數與實參是否匹配:

void printvaules(const

int (&a)[10])

; printvaules(value);

就不會通過編譯了。

這樣做雖然能夠避免出現錯誤的結果,但還是沒有真正的解決問題:要想真正做到正確的實現函式的功能,通常有三種做法:

第一,是在陣列的結尾加乙個特殊的標記來檢測陣列的結束,比如c風格的字串就是在結尾加乙個null。

第二種方法與迭代器的思路類似,傳遞給函式陣列的起始和結束位置。

void printvaules(const

int *beg,const

int *end)

; printvaules(value,value+3);

return

0;

}

三種做法是傳遞給函式陣列的同時,順便傳遞給函式陣列的大小

void printvaules(const

int a,const size_t size)

; printvaules(value,3);

return

0;

}

實參到形參的傳遞

函式呼叫時,實參傳遞到形參時的轉換問題?要點 void swap int x,int y int main void swap int px,int py int main 程式中,雖然pa始終指向a,pb始終指向b,但是a與b的值已發生了交換。int plus int x,int y int ma...

函式實參和形參之間的傳遞

實參可以是常量,變數或表示式。實參與形參的型別應相同或賦值相容。在呼叫函式過程中發生的實參與形參間的資料傳遞,常稱為 虛實結合 1.在定義函式中制定的形參,在沒有出現函式呼叫時,它們不佔記憶體中的儲存單元。在發生函式呼叫時,函式的形參被臨時分配記憶體單元。2.將實參的值傳遞給形參。3.在執行函式時,...

實參與形參的傳遞關係

當我們在主調函式中呼叫方法的時候,需要把型別匹配的實際的資料傳入到方法中。傳進去的那個資料就是實參,而在方法定義中接收引數的那個變數就是形參。下面分三種情況討論 1 傳遞基本資料型別 這種情況下,實參是把值傳遞給形參,形參在函式中改變值不會影響實參。2 傳遞實體物件 這種情況中,實參實際是把物件在堆...