函式的預設值與過載

2021-10-09 05:09:00 字數 1705 閱讀 1417

函式的預設值是給形參設預設值,如果呼叫點已經傳入實參的話,實參就會覆蓋掉形參中的預設值;如果呼叫點沒有傳入實參,將會執行形參的值。

函式的呼叫過程中,實參的入棧順序是自右向左,函式的實參和形參的匹配順序是自左向右。

預設值的賦予規則:

1.自左向右依次賦予

2.預設值不能重複賦予,否則會出現二義性,編譯器將不知道選用誰

3.預設值一般會設定在宣告上,這樣做的好處是如果定義點在呼叫點的下方,也會呼叫成功

double

perimeter

(double a,

double b,

double c=

30.5

)int

main()

int

sum(

int a,

int b,

int c=10)

;int

sum(

int a,

int b=20,

int c)

;/*這個在語法上是出錯的,因為它並沒有按照自右向左的順序依次賦予,

但是在語義上它是真確的,因為第一行已經宣告的c的值

*/int

sum(

int a,

int b,

int c =10)

;int

sum(

int a,

int b,

int c =20)

;/*重複定義,出錯。讓編譯器出現二義性*/

intsum

(int a,

int b,

int c)

intmain()

函式過載的三個條件是:

1.同名,函式名相同

2.不同參,函式的引數不可以相同

3.同作用域,必須在同一作用域下,否則會出現就近原則。

在c語言中,同名函式是不能共存的,但是在c++中同名函式卻可以共存,這是因為它們生成符號的規則不相同。c中符號的生成規則只與函式名有關,在c++中符號的生成規則是和函式原型相關。

函式原型就是指在乙個函式中除了花括號以外的東西。我們知道函式的組成:

返回值 函式名稱 (形參列表)

那函式原型就其實是返回值+函式名稱+形參列表

當我們對乙個函式只宣告未定義的時候,就會出現符號解析的錯誤:

#include

intsum

(int a,

int b)

;int

main()

error lnk2019: 無法解析的外部符號 "int __cdecl sum(int,int)"

(?sum@@yahhh@z),函式 _main 中引用了該符號

我們來拿到括號內的資料:?sum@@yahhh@z,sum代表函式名;ya代表cdecl呼叫約定,(yg代表stdcall,yi代表fastcall);約定後面的第乙個字元如果是h,說明這是int型別,(double型別是n,float型別是m,char型別是d);後面的兩個字元代表了引數的個數;如果有引數的話後面就會加上@z,如果沒有引數的話後面會加上z。

函式預設值 過載 inline函式

一 函式預設值 c89 不支援帶有預設值的函式 c 99 支援帶有預設值的函式 預設值注意事項 1 預設函式一般寫在宣告中 2 自右向左依次賦值 即設定預設值時應該從右至左 因為實參的傳遞是從前至後。如若不是這樣則報錯。3 預設值只能賦一次 4 預設值的限制 int compare int a,in...

C 函式的預設值 函式過載

一 函式的預設值 1 預設值一般寫在宣告中 可以寫多個宣告 int func int a,int b,int c 20 func 10,20 和 func 10,20,30 都可以 2 自左向右依次賦值 實參會替代形參 int func int a 10,int b,int c 20 func 10...

內聯函式 函式過載 函式預設值

為了減少函式呼叫的開銷,引入了內聯函式機制。編譯器處理對內聯函式的呼叫語句時,是將整個函式的 插入到呼叫語句處,而不是產生呼叫函式的語句。inline int max int a,int b 乙個或者多個函式,名字相同,然而引數個數或者引數型別不同,這叫做函式的過載。編譯器根據呼叫語句的實參的個數和...