預設引數和函式過載

2021-09-01 11:47:59 字數 1494 閱讀 8346

一、預設引數

1.概念

預設引數是宣告或定義函式時為函式的引數指定乙個預設值;在呼叫該函式時,如果沒有指定實參則採用該預設值,否則使用指定的實參。

2.分類

(1)全預設引數

void funtest(int a = 1, int b = 2, int c = 3)

(2)半預設引數

void funtest(int a, int b, int c = 3)

3. 注意

(1)半預設引數必須從右往左依次來給出,不能間隔給,下面的**就是錯誤的

void funtest(int a = 1, int b, int c = 3)

(2)預設引數不能在函式宣告和定義中同時出現,下面的**就是錯誤的

void funtest(int a = 1, int b, int c = 3);

void funtest(int a = 1, int b, int c = 3)

(3)預設值必須是常量或者全域性變數

(4)把字尾名改為.c,將會編譯錯誤

二、函式過載

1. 概念

函式過載是函式的一種特殊情況,是指在同一作用域

內,不同引數列表的函式,這組函式被稱為過載函式

,可以有一組具有相同函式名,常用來命名一組功能相似的函式,處理實現功能類似資料型別不同的問題,避免了名字空間

的汙染,對於程式的可讀性有很大的好處。

2. 條件

(1)名字必須相同

(2)引數列表一定不同(引數個數不同;引數型別不同;型別的次序)

(3)返回值型別是否相同沒有關係

3. 幾個問題  

(1)extern 「c」有什麼作用?

在c++工程中在函式前加extern "c",就是將該函式按照c語言來編譯

extern "c" int add(int left, int right)

(2)c語言中為什麼不能支援函式過載?

在vs編譯器中,編譯.c檔案時,只會給函式名之前加上」_」;,所以加入兩個函式名相同的函式在編譯之後的函式名也照樣相同,編譯器呼叫時會因為不知道到底呼叫哪個而報錯

(3) c++中函式過載底層是怎麼處理的?

在vs編譯器中,編譯.cpp檔案時,雖然兩個函式的函式名一樣,但是他們在符號表中生成的名稱不一樣,例如

int add(int left, int right)

(?add@@yahhh@z) 

『?』表示名稱開始,『?』後邊是函式名,「@@ya」表示參數列開始,後邊的3個字元hhh分別表示返回值型別,兩個引數型別;「@z」表示名稱結束; 由於兩個函式生成的符號表中的名稱不一樣,所以是可以編譯通過的

預設引數 函式過載

預設引數 帶有初始值的引數 注 1.非全預設引數,引數的預設值賦值要從最後邊從右向左依次進行 eg int sum int a,int b 1,int c 2 2.實參的匹配是從左向右進行的 eg int sum int a,int b 1,int c 2 sum 10,20 10對應a,20對應b...

c 函式過載和預設引數

函式過載 是c 語言物件導向的特點 多型的一種表現形式 又稱為靜多型 過載的規則 1 函式名相同。2 引數個數不同,引數型別不同,引數順序不同,均可構成過載。3 僅返回值型別不同則不可以構成過載。void func int a ok void func char a ok void func int...

函式過載和函式的預設引數

函式過載 如果同乙個作用域內的幾個函式名字相同但形參列表不同,我們稱之為過載函式。main函式不能過載。返回值不能用來判斷函式是否過載。引數列表不同 引數的個數不同 引數的型別不同 引數的順序不同 void print int a void print double b int print int ...