重載函數(shù)(overloaded function)是C++支持的一種特殊函數(shù),C++編譯器對函數(shù)重載的判斷更是C++語言中最復(fù)雜的內(nèi)容之一
首先我們先明確一下重載函數(shù)的定義:在相同的聲明域中的函數(shù)名相同的,而參數(shù)表不同的,即通過函數(shù)的參數(shù)表而標(biāo)識并且來區(qū)分函數(shù)的一種特殊的函數(shù)。
您也許要問,函數(shù)為什么要重載呢?何時(shí)應(yīng)該選擇函數(shù)重載(function overloading),何時(shí)又不呢?這也是我要在下面介紹的。
當(dāng)將要定義一組函數(shù),使它們執(zhí)行一系列的操作,但是它們是應(yīng)用在不同的參數(shù)類型上的。此時(shí)我們可以選擇重載函數(shù)。
例如: int z_x_max (int,int); //返回兩個(gè)整數(shù)的值;
int ve_max (const vector <int> &); //返回vector容器中的值;
int matrix_max (const matrix &); //返回matrix引用的值;
上面的三個(gè)函數(shù)都可以大概地說成判斷一組數(shù)中的值,對于函數(shù)的用戶來說,他們并不關(guān)心函數(shù)定義的細(xì)節(jié),也就是說他們不關(guān)心判斷兩個(gè)整數(shù)的大小和判斷數(shù)組(vector容器)數(shù)的大小應(yīng)該使用不同的函數(shù),而對于程序的設(shè)計(jì)者來說這可是不得不想到的。程序員必須記住并查找每個(gè)函數(shù)名。而函數(shù)的重載把程序員從這種問題的復(fù)雜性中解放了出來,C++提供了這種支持。上面的三個(gè)比較大小的函數(shù)可以定義成:
int Max (int,int); //返回兩個(gè)整數(shù)的值;
int Max (const vector <int> &); //返回vector容器中的值;
int Max (const matrix &); //返回matrix引用的值;
對!通過參數(shù)就可以一眼分辨不同的函數(shù)。
同時(shí)函數(shù)的重載也有它不適用的情況。例如:在開發(fā)文本編輯器的過程中,會涉及到一系列控制光標(biāo)的函數(shù),如下:
Screen& MoveUp( );
Screen& MoveDown( );
Screen& MoveLeft( );
Screen& MoveRight( );
看過這四個(gè)函數(shù)不言而喻,它們是控制光標(biāo)在屏幕上的位置的,即:向上移動光標(biāo),向下移動光標(biāo),向左移動光標(biāo),向右移動光標(biāo)。如果我現(xiàn)在把它們寫成重載函數(shù),每個(gè)都是Screen& Move( );顯然對于程序員來說是不易理解的。因此對于函數(shù)重載的使用我們應(yīng)遵循應(yīng)用的邏輯,而不是簡單地因?yàn)樗拇嬖诰捅仨毷褂盟3绦騿T不應(yīng)該勉強(qiáng)使用重載函數(shù)。
您有沒有想過C++編譯器是如何判斷您調(diào)用的是重載中的哪個(gè)函數(shù)?即使它們的函數(shù)名相同。您也許會毫不猶豫的回答:是通過函數(shù)的參數(shù)表。其實(shí)識別的過程并不是像您想象中的那么的容易,其中涉及到參數(shù)的等級劃分,參數(shù)轉(zhuǎn)換等諸多方面,下面我就一一進(jìn)行講解。
假如有下面一組函數(shù):
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 );的調(diào)用與S ( ); S ( int ); S ( double , double = 1.2); S (const char* , const char*),的聲明在同一域,即是可見的。
那么好,問題出現(xiàn)了。S (2.4 );將調(diào)用上面四個(gè)函數(shù)中的哪一個(gè)呢?
編譯器判斷重載函數(shù)的第一步是確定該調(diào)用中所考慮的重載函數(shù)的集合,該函數(shù)集合被稱為候選函數(shù)(candidant function)。所謂候選函數(shù)就是與被調(diào)用函數(shù)同名的函數(shù)。上面的前四個(gè)函數(shù)都可以成為候選函數(shù)(當(dāng)然可以是多個(gè)),而唯有Max ( int , int ) 被排除在外了。
編譯器判斷重載函數(shù)的第二步分為兩動作。第一個(gè)動作是編譯器從第一步選出的候選函數(shù)中調(diào)出可行函數(shù)(viable function)??尚泻瘮?shù)的函數(shù)參數(shù)個(gè)數(shù)與調(diào)用的函數(shù)參數(shù)個(gè)數(shù)相同(如S ( int )),或者可行函數(shù)的參數(shù)可以多一些,但是多出來的函數(shù)參數(shù)都要有相關(guān)的缺省值(如 S (double , double =1.2 );)第二個(gè)動作是根據(jù)參數(shù)類型的轉(zhuǎn)換規(guī)則將被調(diào)用的函數(shù)實(shí)參轉(zhuǎn)換(conversion)成候選函數(shù)的實(shí)參。這里本著充分利用參數(shù)類型轉(zhuǎn)換的原則,換句話說,盡可能的使用上參數(shù)類型轉(zhuǎn)換。當(dāng)然轉(zhuǎn)換要以候選函數(shù)為轉(zhuǎn)換的目標(biāo)。上面的函數(shù)中只有兩個(gè)是可行函數(shù),它們分別是S ( int ); S ( double , double )。
首先我們先明確一下重載函數(shù)的定義:在相同的聲明域中的函數(shù)名相同的,而參數(shù)表不同的,即通過函數(shù)的參數(shù)表而標(biāo)識并且來區(qū)分函數(shù)的一種特殊的函數(shù)。
您也許要問,函數(shù)為什么要重載呢?何時(shí)應(yīng)該選擇函數(shù)重載(function overloading),何時(shí)又不呢?這也是我要在下面介紹的。
當(dāng)將要定義一組函數(shù),使它們執(zhí)行一系列的操作,但是它們是應(yīng)用在不同的參數(shù)類型上的。此時(shí)我們可以選擇重載函數(shù)。
例如: int z_x_max (int,int); //返回兩個(gè)整數(shù)的值;
int ve_max (const vector <int> &); //返回vector容器中的值;
int matrix_max (const matrix &); //返回matrix引用的值;
上面的三個(gè)函數(shù)都可以大概地說成判斷一組數(shù)中的值,對于函數(shù)的用戶來說,他們并不關(guān)心函數(shù)定義的細(xì)節(jié),也就是說他們不關(guān)心判斷兩個(gè)整數(shù)的大小和判斷數(shù)組(vector容器)數(shù)的大小應(yīng)該使用不同的函數(shù),而對于程序的設(shè)計(jì)者來說這可是不得不想到的。程序員必須記住并查找每個(gè)函數(shù)名。而函數(shù)的重載把程序員從這種問題的復(fù)雜性中解放了出來,C++提供了這種支持。上面的三個(gè)比較大小的函數(shù)可以定義成:
int Max (int,int); //返回兩個(gè)整數(shù)的值;
int Max (const vector <int> &); //返回vector容器中的值;
int Max (const matrix &); //返回matrix引用的值;
對!通過參數(shù)就可以一眼分辨不同的函數(shù)。
同時(shí)函數(shù)的重載也有它不適用的情況。例如:在開發(fā)文本編輯器的過程中,會涉及到一系列控制光標(biāo)的函數(shù),如下:
Screen& MoveUp( );
Screen& MoveDown( );
Screen& MoveLeft( );
Screen& MoveRight( );
看過這四個(gè)函數(shù)不言而喻,它們是控制光標(biāo)在屏幕上的位置的,即:向上移動光標(biāo),向下移動光標(biāo),向左移動光標(biāo),向右移動光標(biāo)。如果我現(xiàn)在把它們寫成重載函數(shù),每個(gè)都是Screen& Move( );顯然對于程序員來說是不易理解的。因此對于函數(shù)重載的使用我們應(yīng)遵循應(yīng)用的邏輯,而不是簡單地因?yàn)樗拇嬖诰捅仨毷褂盟3绦騿T不應(yīng)該勉強(qiáng)使用重載函數(shù)。
您有沒有想過C++編譯器是如何判斷您調(diào)用的是重載中的哪個(gè)函數(shù)?即使它們的函數(shù)名相同。您也許會毫不猶豫的回答:是通過函數(shù)的參數(shù)表。其實(shí)識別的過程并不是像您想象中的那么的容易,其中涉及到參數(shù)的等級劃分,參數(shù)轉(zhuǎn)換等諸多方面,下面我就一一進(jìn)行講解。
假如有下面一組函數(shù):
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 );的調(diào)用與S ( ); S ( int ); S ( double , double = 1.2); S (const char* , const char*),的聲明在同一域,即是可見的。
那么好,問題出現(xiàn)了。S (2.4 );將調(diào)用上面四個(gè)函數(shù)中的哪一個(gè)呢?
編譯器判斷重載函數(shù)的第一步是確定該調(diào)用中所考慮的重載函數(shù)的集合,該函數(shù)集合被稱為候選函數(shù)(candidant function)。所謂候選函數(shù)就是與被調(diào)用函數(shù)同名的函數(shù)。上面的前四個(gè)函數(shù)都可以成為候選函數(shù)(當(dāng)然可以是多個(gè)),而唯有Max ( int , int ) 被排除在外了。
編譯器判斷重載函數(shù)的第二步分為兩動作。第一個(gè)動作是編譯器從第一步選出的候選函數(shù)中調(diào)出可行函數(shù)(viable function)??尚泻瘮?shù)的函數(shù)參數(shù)個(gè)數(shù)與調(diào)用的函數(shù)參數(shù)個(gè)數(shù)相同(如S ( int )),或者可行函數(shù)的參數(shù)可以多一些,但是多出來的函數(shù)參數(shù)都要有相關(guān)的缺省值(如 S (double , double =1.2 );)第二個(gè)動作是根據(jù)參數(shù)類型的轉(zhuǎn)換規(guī)則將被調(diào)用的函數(shù)實(shí)參轉(zhuǎn)換(conversion)成候選函數(shù)的實(shí)參。這里本著充分利用參數(shù)類型轉(zhuǎn)換的原則,換句話說,盡可能的使用上參數(shù)類型轉(zhuǎn)換。當(dāng)然轉(zhuǎn)換要以候選函數(shù)為轉(zhuǎn)換的目標(biāo)。上面的函數(shù)中只有兩個(gè)是可行函數(shù),它們分別是S ( int ); S ( double , double )。

