1. 程式人生 > >c++函式過載與預設引數

c++函式過載與預設引數

函式過載:是指同一作用域內,一組具有相同函式名,不同引數列表的函式,構成過載關係,這組名稱相同的函式成為過載函式。過載函式通常完成的功能相近,這樣做的好處是減少了函式名的數量,提高了程式的可讀性。

注意:過載與函式的返回型別無關,引數相同僅返回值不同的兩個函式不構成過載關係,與形參名字無關,只與引數的個數、型別、順序有關。

//可以構成過載關係的例子

void   fun(void);

void  fun(int);

void  fun(double);

void fun(int , double)

void fun( double, int);

相同型別的引用與非引用型別不構成過載關係,例如:void fun( int );與void fun( int & r);不構成過載關係。

過載解析:在函式呼叫的時候,根據實參與形參的型別匹配情況,選擇一個確定的過載版本,這個過程叫做過載解析。

注意:只有在同一個作用域中的同名函式才會涉及到過載問題,不同作用域中的同名函式遵循隱藏的原則。

函式指標與過載的關係:函式指標的型別決定與其匹配的過載版本。例如:

double fun(int n);

char * fun(float n);

doule (*pfun)(int) = fun;//對應double fun(int n);

char *( *pfun)(float) = fun;//對應char * fun(float n);

C++中的函式過載是通過函式換名來實現的,因此換名機制業限制了C語言和C++模組之間的交叉引用。通過extern "C"可以要求C++編譯器按照C語言的處理方式處理函式介面,因此不做換名處理,也就無法進行過載。

函式預設引數

函式預設引數:即可以為函式的部分或全部形參指定預設值,呼叫該函式時,如果不給實參,就取預設值作為相應的形參的值。

注意:(使用確實值時的注意事項)

1、函式預設引數必須靠右,如果一個引數有預設值,那麼 這個引數的右側所有引數都必須有預設值。

2、如果需要將函式的定義和宣告分開,預設引數只能寫在函式宣告的部分,而定義部分不要指定函式的預設引數,但是可以通過註釋的方式提高程式碼的可讀性。

//預設引數使用
void func(int a,int b=100/*預設引數*/){
    return a+b;
}
//預設引數必須靠右
void func(int a=20,int b);//error
void func(int b,int a=20);//ok
//函式宣告的時候寫預設值,定義是不能寫
void fun( int a,int b=100 );//宣告
void fun( int a,int d /* =100  */){//函式的定義
    return a+ b;
}
//函式某個引數預設則其右側所有引數都必須要有預設值
void func(int b,int a=20,int b =10,int c );//error
void func(int b,int a=20,int b =10,int c=5 );//ok