一、函式的預設值
給函式形參賦預設值時要注意的三點:
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--》bool2.過載決議:h--》int
n--》double
(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 在宣告時給定預設值,在定義時仍然給預設值,當給出的兩個預設值不同時導致編譯...