一.構成函數重載的條件如下:
1.函數名相同。
2.這些同名函數的形式參數(指參數的個數、類型或者順序)必須不同,即參數列表不同。
3.傳回值類型不同不構成重載函數。
二.重載函數的匹配原則:
1、嚴格匹配,找到後就調用。
2、沒有找到嚴格匹配的函數,但是可以通過隱式轉化,找到適合的重載函數。
例:
1.參數類型不一樣
void print(int a)
{
printf("void print(int a)\n");
}
void print(string a)
{
printf("void print(string a)\n");
}
2.參數個數不同(較1)
void print(int a ,string b);
3.參數順序不同(較2)
void print(string a ,int b);
為了估計哪個重載函數最適合,需要依次按照下列規則來判斷: 精確匹配:參數匹配而不做轉換,或者只是做微不足道的轉換,如數組名到指標、函數名到指向函數的指標、T到const T; 提升匹配:即整數提升(如bool 到 int、char到int、short 到int),float到double 使用標準轉換匹配:如int 到double、double到int、double到long double、Derived*到Base*、T*到void*、int到unsigned int; 使用使用者自訂匹配; 使用省略符號匹配:類似printf中省略符號參數
“同一範圍”也是在函數重載的定義中的一個限定,如果不在一個範圍,不能算是函數重載,如下面的代碼:
void f(int);void g(){ void f(double); f(1); //這裡調用的是f(double),而不是f(int)} 即 內層範圍的函數會隱藏外層的同名函數 。 同樣的衍生類別的成員函數會隱藏基類的同名函數 。這很好理解,變數的訪問也是如此,如一個函數體內要訪問全域的同名變數要用“::”限定。
本文只是作粗略基本介紹,瞭解更多請參照大神http://www.cnblogs.com/skynet/archive/2010/09/05/1818636.html