行內函數
行內函數是指用inline關鍵字修飾的函式。在類內定義的函式被預設成行內函數。行內函數從原始碼層看,有函式的結構,而在編譯後,卻不具備函式的性質
inline關鍵字只是給編譯器一個建議,編譯器不一定會接受這種建議。一些編譯器,會將簡單的函式做內聯編譯,即使它沒有用inline關鍵字宣告
C++編譯器直接將函式體插入函式呼叫的地方
行內函數沒有普通函式呼叫時的額外開銷(壓棧,跳轉,返回)
inline int func(int a, int b)
{
return a < b ? a : b;
}
C++中內聯編譯的限制
- 不能存在任何形式的迴圈語句;
- 不能存在過多的條件判斷語句;
- 函式體不能過於龐大;
- 不能對函式進行取址操作;(內斂編譯後,行內函數將不存在)
- 函式內聯宣告必須在呼叫語句之前。
如果存在以上衝突,C++編譯器會忽略inline關鍵字
預設引數
C++支援設定預設引數,在函式呼叫的時候不賦值會使用預設值
void func(int x = 3)
{
printf("x:%d\n", x);
}
如果有多個引數,預設引數要放在引數列表最後面
void func(int a, int b, int x = 3, int y = 4)
{
printf("x:%d\n", x);
}
佔位引數
有時候在函式定義時候,會有不確定引數
此時會有佔位引數,呼叫的時候需要按位賦值
佔位引數一般用於程式的擴充和對C程式碼的相容
int func (int x, int y, int )
{
return x + y;
}
佔位引數可以設定預設引數
設定預設引數以後,函式呼叫時候可以省略
int func2(int a, int b, int = 0)
{
return a + b;
}
函式過載
C++允許函式過載
C++允許在同一範圍中宣告幾個功能類似的同名函式,但是這些同名函式的形式引數(指引數的個數、型別或者順序)必須不同,函式過載不涉及函式返回值
void myprint(int a)
{
printf("a:%d \n", a);
}
void myprint(int a, char b)
{
printf("a:%d \n", a);
}
當函式過載與預設函式引數時候會產生二義性
int func(int a, int b , int c= 0)
{
printf("a:%d ", a);
return 0;
}
int func(int a, int b)
{
printf("a:%d ", a);
return 0;
}
當使用func(1,2)
呼叫函式時候,編譯器會不知道如何呼叫,會編譯失敗