函式預設值和內聯函式 吃魚的小臉貓 新浪部落格

2021-09-25 19:12:53 字數 1630 閱讀 9402

一、函式預設值

1.定義:

我們可以賦予函式引數預設值。所謂預設值就是在呼叫時,可以不寫某些引數的值,編譯器會自動把預設值傳遞給呼叫語句中。預設值可以在宣告或定義中 設定;也可在宣告或定義時都設定,都設定時要求預設值是相同的。

2.函式預設值的特性

(1)預設引數在函式宣告中提供,當又有宣告又有定義時,定義中不允許默 認引數,如果函式中只有定義,則預設引數才可以出現在函式定義中。

例如:

void point(int=3,int=4); //宣告中給出預設值

void point(intx,inty) //定義中不允許再給出預設值

(2)如果乙個函式中有多個預設引數,預設引數傳參的順序是從右向左,匹配是從左向右;

例如:void func(int a=1,int b,int c=3, int d=4); //error

void func(int a, int b=2,int c=3,int d=4); //true

對於第2個函式宣告,其呼叫的方法規定為:

func(10,15,20,30); //true:呼叫時給出所有實參

func(); //error:引數a沒有預設值

func(i2,12); //true:引數c和d預設

func(2,15,20); //error:只能從右到左順序匹配預設

(3)預設值的限定:預設值可以是全域性變數、全域性常量、函式;

例如:int a=1;

int fun(int);

int g(int x;fun(a)); //ok:允許預設值為函式

預設值不可以是區域性變數,因為預設引數的函式呼叫實在編譯期間確定的,區域性變數的位置和值在編譯期間是無法確定的。

例如:void fun() 

3.函式預設值的設計

(1)函式預設值自右向左一次性設計

(2)預設值不能重複賦值

二、inline修飾的函式 (內聯函式)

1.特點:

(1)在函式呼叫點之間(在編譯期間)展開,不生成符號;

(2)內聯只是編譯器的建議;

(3)在debug版本下不生效,只在release下生效

(4)針對遞迴,系統一定不會使用內聯函式,因為無法確定遞迴的深度

2.優點:

沒有函式開棧和清棧的開銷;

3.缺點:

(1)目標**太大

(2)編譯時間太長

4.當函式執行的開銷 < 函式開棧的開銷(即函式體較小的),選擇內聯函式。

5.內聯函式的區別

(1)與普通函式的區別:

a.內聯函式是**被插入到呼叫者**處的函式

b.內聯函式在編譯時,對每次呼叫都生成乙個副本,執行時,內聯函式直接展開(類似巨集)即可執行。

普通函式編譯時,只生成乙個副本,在執行時,需進行一些進棧出棧操作來呼叫函式,和初始化引數。

c.內聯函式占用記憶體大,效率高,普通函式占用記憶體小,效率低

(2)與巨集的區別:

內聯函式編譯期間處理,有型別和安全檢查,且可除錯;

巨集在預編譯期間處理,無型別和安全檢查,不可除錯;

(3)與static修飾的函式的區別:

內聯函式不生成函式符號;

static修飾的函式是在編譯期間生成符號,保證本檔案可見;

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

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

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

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

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

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