函式的預設值 過載以及內聯函式

2021-09-01 16:07:47 字數 2709 閱讀 3314

一、函式的預設值

給函式形參賦預設值時要注意的三點:

1.從右向左依次賦預設值

int sum(int a,int b,int c=10);//正確

int sum(int a,int b=10,int c);//編譯程式報錯:「sum」: 缺少引數 3 的預設引數

聯想記憶:我們都知道實參與形參的匹配是從左到右進行匹配的,當實參不夠時,才會看有沒有賦預設值,所以預設值是從右到左依次賦予的。

2.預設值只能賦一次

同一函式可多次宣告,但預設值只能賦一次

int sum(int a,int b,int c=10);

int sum(int a,int b,int c=10);//編譯程式報錯:「sum」: 重定義預設引數 : 引數 3

3.一般在宣告中賦預設值

若宣告時賦了值,則函式定義時不能再次賦值;

int sum(int a,int b,int c=10);

int sum(int a,int b,int c=10)//程式編譯報錯「sum」: 重定義預設引數 : 引數 3

int main()

若宣告時沒賦值,則在定義函式時賦值正確,但是此時若定義點放在主函式後面,如下:則錯誤。

int sum(int a,int b,int c);

int main()

int sum(int a,int b,int c=10)

注意:若呼叫點給了函式實參,實參會替代預設值。

如:

int sum(int a,int b,int c=10)

int main()

若呼叫點給實參值的個數少於函式定義時形參個數,並且函式已經賦過預設值,則若呼叫點所給實參值的個數大於或等於(小於會報錯)函式的引數總個數減已經被賦過預設值的形參個數,則將實參值(從左向右)依次分配給未賦預設值的形參(從左向右)。

二、函式過載

1.c語言與c++中函式符號的生成規則:

(1)c語言中函式符號的生成只和函式名有關,不能定義兩個函式名相同的函式

(2)c++中函式符號的生成和函式原型有關,包括函式的返回值型別、函式名、形參列表(型別,個數,順序)

c++中生成的函式符號示例如下:

ya:__cdecl呼叫約定,預設

yg:__stdcall

yi:__fastcalll

引數型別及返回值型別對應生成的符號:

_n--》bool

h--》int

n--》double

2.過載決議:

(1)不能讓編輯器產生二義性

(2)函式過載不依賴返回值:這是因為,在編譯階段,呼叫點匹配時只能看見函式名和形參列表,看不見函式的返回值型別,所以只有函式返回值型別不同是不能構成過載的。

3.函式過載的三要素:

(1)同作用域下(才能進行過載)

(2)同名 

(3)引數不同

注意:c語言不支援過載機制,過載是c++中的,這是由二者函式符號的生成規則而導致的,c++中函式符號的生成和函式原型包括返回值、函式名、形參列表(型別、個數、順序)有關,函式的形參為函式過載提供了支援。

三、內聯函式

函式前用關鍵字inline修飾的函式即為內聯函式,編譯階段在函式呼叫點直接展開**,沒有開棧清棧開銷。

1.內聯函式的優缺點:

(1)優點:可以提高效率

(2)缺點:以**膨脹為代價(浪費空間),即以空間換時間

所以,如果**的執行開銷 

2.內聯的注意事項:

(1)內聯函式寫在標頭檔案中

(2)內聯只在release版本生效,在debug版本不生效

(3)含有遞迴、迴圈、switch的內聯函式,編譯器會當普通函式處理,內聯只是給編譯器的建議

(4)內聯是基於實現的關鍵字。在宣告點加inline編譯器會忽略,只能加在定義點,加在宣告點是無效的

(5)內聯函式是不生成符號的

注意:內聯函式不是在呼叫時發生控制轉移,而是在編譯時將函式題嵌入在每乙個呼叫處。編譯時,類似巨集替換,使用函式體替換呼叫處的函式名。

內聯函式沒有棧幀開闢和清理的開銷(不開棧,也就不用清棧)

static修飾的函式有開棧和清棧的開銷

前者內聯是因為編譯階段在函式呼叫點直接展開**而導致(編譯階段是以乙個原始檔為編譯單元)

而後者是因為static修飾的函式是local屬性。

4.inline與巨集的區別

inline:編譯階段處理        有型別檢查              安全

巨集:    預編譯階段處理     無型別檢查             不安全

inline是一種更安全的巨集

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

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

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

c 在宣告函式原型的時候,可以為乙個或多個引數指定預設引數值,當函式呼叫的時候,如果沒有指定這個值,編譯器會自動用預設值替代。列如 int sum int a 1 int b 10 int main 函式預設值的特點自右向左,依次設計 預設值不能重複賦值 即如果函式宣告和函式定義分開,函式宣告設定了...

函式預設值,內聯函式和函式的過載

實參匹配形參時從左向右匹配,但是從右向左依次賦預設值。函式預設值不能重複複製 例如 int fun int a,int b,int c 30 int fun int a,int b,int c 30 return a b c 在宣告時給定預設值,在定義時仍然給預設值,當給出的兩個預設值不同時導致編譯...