C++行內函數、函式過載與函式預設引數

AK龍發表於2018-04-20

一、行內函數

  • 背景:函式呼叫是有時間開銷的。如果函式本身只有幾條語句,執行非常快,而且函式被反覆執行很多次,相比之下呼叫函式所產生的這個開銷就會顯得比較大。
  • 目的:為了減少函式呼叫的開銷,引入了行內函數機制。編譯器處理對行內函數的呼叫語句時,是將整個函式的程式碼插入到呼叫語句處,而不會產生呼叫函式的語句。 
  • 程式碼例項:(inline代表行內函數)
inline int Max(int a,int b) 
{  
	if( a > b) return a;  
	return b;  
} 

二、函式過載

  • 定義:一個或多個函式,名字相同,然而引數個數或引數型別不相同,這叫做函式的過載。 
  • 以下三個函式是過載關係:  

int Max(double f1,double f2) {    } 

int Max(int n1,int n2) {   }  

int Max(int n1,int n2,int n3) {   } 

Max(3.4,2.5);      //呼叫 (1)  

Max(2,4);       //呼叫 (2)  

Max(1,2,3);      //呼叫 (3)  

Max(3,2.4);      //error,二義性 

優點:

  • 函式過載使得函式命名變得簡單。
  • 編譯器根據呼叫語句的中的實參的個數和型別判斷應該呼叫哪個函式。 

三、函式預設引數

  • 定義: C++中,定義函式的時候可以讓最右邊的連續若干個引數有預設值,那麼呼叫函式的時候,若相應位置不寫引數,引數就是預設值。 
  • 目的:函式引數可預設的目的在於提高程式的可擴充性。
  • 優點:即如果某個寫好的函式要新增新的引數,而原先那些呼叫該函式的語句,未必需要使用新增的引數,那麼為了避免對原先那些函式呼叫語句的修改,就可以使用預設引數。
  • 程式碼例項
void func( int x1, int x2 = 2, int x3 = 3) {  } 

func(10 ) ; //等效於 func(10,2,3) 
func(10,8) ; //等效於 func(10,8,3) 
func(10, , 8) ; //不行,只能最右邊的連續若干個引數預設

函式引數的預設值也可以理解為函式引數的預設值。當你傳入引數時,引數就是你傳入的數,當你不給它引數時,引數就是預設值,也就是預設值。

注:使用函式預設引數要注意避免有函式過載的二義性

void valueX(int val = 0){
	x = val;
} 
int valueX(){
	return x;
}
valueX();//錯誤,無法判斷呼叫的是哪個valueX 

相關文章