一、函式預設值
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 函式預設值的特點自右向左,依次設計 預設值不能重複賦值 即如果函式宣告和函式定義分開,函式宣告設定了...