函數預設值
C++在聲明函數原型的時候,可以為一個或多個參數指定預設參數值,當函數調用的時候,如果沒有指定這個值,編譯器會自動用預設值替代。
列如:
int Sum(int a=1 ,int b =10)
{
return a+b;
}
int main
{
sum(1,2);//正常調用函數
sum(1);//隻傳了一個參數,但由于聲明了預設值,編譯器會自動替換成預設參數
sum();//直接使用預設值替換
}
函數預設值的特點
- 自右向左,依次設計
- 預設值不能重複指派(即如果函數聲明和函數定義分開,函數聲明設定了預設參數,函數定義不能再設定預設參數。)
- 一般把預設值賦在聲明上
零初始化
int Sum (double a =double(),int b =int (),char c =char();
代表對應類型的0;
内聯函數
在計算機科學中,内聯函數(有時稱作線上函數或編譯時期展開函數)是一種程式設計語言結構,用來建議編譯器對一些特殊函數進行内聯擴充(有時稱作線上擴充);也就是說建議編譯器将指定的函數體插入并取代每一處調用該函數的地方(上下文),進而節省了每次調用函數帶來的額外時間開支。但在選擇使用内聯函數時,必須在程式占用空間和程式執行效率之間進行權衡,因為過多的比較複雜的函數進行内聯擴充将帶來很大的存儲資源開支。另外還需要特别注意的是對遞歸函數的内聯擴充可能引起部分編譯器的無窮編譯。
C++中用 inline修飾的函數稱之為内聯函數
内聯函數的特點:在函數調用點之間展開
好處:無函數開棧淸棧開銷,速度快
缺點:以代碼膨脹為代價,空間換取時間
inline函數隻是給編譯器的一個建議:如果函數執行的開銷小于函數開棧的開銷使用内聯函數。
内聯在debug版本不生效,隻在release 生效
遞歸函數一定不會成為内聯函數,編譯器會将其按普通函數處理
inline函數與普通函數的差別
内聯隻是在函數前加inline,在之就是内部實作上,内聯直接在調用點展開(和宏有些相似)而普通函數被調用時,系統首先跳躍到該函數的入口位址,執行函數體,執行完成後,再傳回到函數調用的地方,函數始終隻有一個拷貝。
inline函數與宏的差別
inline函數編譯期間處理 有類型檢查和安全檢查 ,可以調試
宏在預編譯期間處理,無類型檢查和安全檢查 , 不可調試
inline函數與static修飾的函數的差別
- 從作用域來看,兩者都是隻有本檔案可見
- static函數修飾變量和函數,而inline隻修飾函數
-
static修飾的函數在符号表中産生的符号是local的,inline修飾的直接在調用點展開,不産生符号
内聯函數的注意事項
- 一般實作在.h檔案中
- 内聯在debug版本不生效,隻在release 生效
- 隻是給編譯器的一個建議。遞歸、循環、switch 均不能成為内聯函數
- 内聯要基于實作,不是基于聲明的。
函數重載
C++ 不允許變量重名,但是允許多個函數取相同的名字,隻要參數表不同即可,這叫作函數的重載。重載就是裝載多種東西的意思,即同一個事物能完成不同功能。使用函數重載可以讓程式員對完成相似功能不同函數,起相同函數名。
列如
int fun(int a,int b )//原函數
{
return a+b;
}
double fun(double a,double b)//傳回值參數類型不同,可以重載
{
return a+b;
}
double fun(int a,int b)//隻有傳回值不同,不能重載
{
return a+b;
}
下面檢視vs中符号表,正因為符生成的符号不同,是以才可以使用重載
重載的依據
- 函數名相同,形參類型不同
- 不能除傳回值不同外,其餘參數類型相同
函數重載的三要素
- 同名作用域
- 同名
- 參數不同