函式的預設值是給形參設預設值,如果呼叫點已經傳入實參的話,實參就會覆蓋掉形參中的預設值;如果呼叫點沒有傳入實參,將會執行形參的值。
函式的呼叫過程中,實參的入棧順序是自右向左,函式的實參和形參的匹配順序是自左向右。
預設值的賦予規則:
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 乙個或者多個函式,名字相同,然而引數個數或者引數型別不同,這叫做函式的過載。編譯器根據呼叫語句的實參的個數和...