void S ( ); void S ( int ); void S ( double , double = 1.2 ); void S ( const char*,const char*); void Max ( int , int ); //…… int main( ) { S (2.4); return; } //S (2.4 );的調用與S ( ); S ( int ); S ( double , double = 1.2); S (const char* , const char*),的聲明在同一域,即是可見的。
那么好,問題出現了。S (2.4 );將調用上面四個函數中的哪一個呢?
編譯器判定重載函數的第一步是確定該調用中所考慮的重載函數的集合,該函數集合被稱為候選函數(candidant function)。所謂候選函數就是與被調用函數同名的函數。上面的前四個函數都可以成為候選函數(當然可以是多個),而唯有Max ( int , int ) 被排除在外了。
編譯器判定重載函數的第二步分為兩動作。第一個動作是編譯器從第一步選出的候選函數中調出可行函數(viable function)??尚泻瘮档暮瘮祬祩€數與調用的函數參數個數相同(如S ( int )),或者可行函數的參數可以多一些,但是多出來的函數參數都要有相關的缺省值(如 S (double , double =1.2 );)第二個動作是根據參數類型的轉換規則將被調用的函數實參轉換(conversion)成候選函數的實參。這里本著充分利用參數類型轉換的原則,換句話說,盡可能的使用上參數類型轉換。當然轉換要以候選函數為轉換的目標。上面的函數中只有兩個是可行函數,它們分別是S ( int ); S ( double , double )。
假如依照參數轉換規則沒有找到可行函數,則該調用就是錯誤的,則說沒有函數與調用匹配,屬于無匹配情況(no match function)。
編譯器判定重載函數的第三步是從第二步中選出的可行函數中選出最佳可行函數(best match situation)。在最佳可行函數的選擇中,從函數實參類型到相應可行函數參數所用的轉化都要劃分等級,根據等級的劃分(ranked),最后選出最佳可行函數。