C++學習筆記-C++對C語言的函式擴充

weixin_30639719發表於2020-04-05

行內函數

行內函數是指用inline關鍵字修飾的函式。在類內定義的函式被預設成行內函數。行內函數從原始碼層看,有函式的結構,而在編譯後,卻不具備函式的性質

inline關鍵字只是給編譯器一個建議,編譯器不一定會接受這種建議。一些編譯器,會將簡單的函式做內聯編譯,即使它沒有用inline關鍵字宣告
C++編譯器直接將函式體插入函式呼叫的地方
行內函數沒有普通函式呼叫時的額外開銷(壓棧,跳轉,返回)

inline int func(int a, int b)
{
	return a < b ? a : b;
}

C++中內聯編譯的限制

  1. 不能存在任何形式的迴圈語句;
  2. 不能存在過多的條件判斷語句;
  3. 函式體不能過於龐大;
  4. 不能對函式進行取址操作;(內斂編譯後,行內函數將不存在)
  5. 函式內聯宣告必須在呼叫語句之前。
    如果存在以上衝突,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)呼叫函式時候,編譯器會不知道如何呼叫,會編譯失敗

轉載於:https://www.cnblogs.com/cj5785/p/10664741.html

相關文章