重載函式(函式重載)

重載函式

函式重載一般指本詞條

重載函式是函式的一種特殊情況,為方便使用,C++允許在同一範圍中聲明幾個功能類似的同名函式,但是這些同名函式的形式參數(指參數的個數、類型或者順序)必須不同,也就是說用同一個函式完成不同的功能。這就是重載函式。重載函式常用來實現功能類似而所處理的數據類型不同的問題。不能只有函式返回值類型不同。

基本介紹

  • 中文名:重載函式
  • 外文名:overloaded function
  • 程式類型:C++
  • 屬性:特殊函式
說明,套用,

說明

兩個重載函式必須在下列一個或兩個方面有所區別:
1、函式的參數個數不同。
2、函式的參數類型不同或者參數類型順序不同,
C++的這種編程機制給編程者極大的方便,不需要為功能相似、參數不同的函式選用不同的函式名,也增強了程式的可讀性。
C++運算符重載的相關規定如下:
(1)不能改變運算符的優先權;
(2)不能改變運算符的結合型;
(3)默認參數不能和重載的運算符一起使用;
(4)不能改變運算符的運算元的個數;
(5)不能創建新的運算符,只有已有運算符可以被重載;
(6)運算符作用於C++內部提供的數據類型時,原來含義保持不變。

套用

重載函式(overloaded function)是C++支持的一種特殊函式,C++編譯器函式重載的判斷更是C++語言中極為複雜的內容之一。
首先我們先明確一下重載函式的定義:在相同的聲明域中的函式名相同的,而參數表不同的,即通過函式的參數表而唯一標識並且來區分函式的一種特殊的函式。
您也許要問,函式為什麼要重載呢?何時應該選擇函式重載(function overloading),何時又不呢?這也是我要在下面介紹的。
函式的重載其實就是“一物多用”的思想(這裡指的“物”是“函式名”),其實不僅是函式可以重載,運算符也是可以重載的。例如:運算符“<<”和“>>”既可以作為移位運算符,又可以作為輸出流中的插入運算符和輸入流中的提取運算符。
當將要定義一組函式,使它們執行一系列的操作,但是它們是套用在不同的參數類型上的。此時我們可以選擇重載函式。
例如: int z_x_max (int,int); //返回兩個整數的最大值;
int ve_max (const vector <int> &); //返回vector容器中的最大值;
int matrix_max (const matrix &); //返回matrix引用的最大值;
上面的三個函式都可以大概地說成判斷一組數中的最大值,對於函式的用戶來說,他們並不關心函式定義的細節,也就是說他們不關心判斷兩個整數的大小和判斷數組(vector容器)數的大小應該使用不同的函式,而對於程式的設計者來說這可是不得不想到的。程式設計師必須記住並查找每個函式名。而函式的重載把程式設計師從這種問題的複雜性中解放了出來,C++提供了這種支持。上面的三個比較大小的函式可以定義成:
int Max (int,int); //返回兩個整數的最大值;
int Max (const vector <int> &); //返回vector容器中的最大值;
int Max (const matrix &); //返回matrix引用的最大值;
通過參數就可以一眼分辨不同的函式。
同時函式的重載也有它不適用的情況。例如:在開發文本編輯器的過程中,會涉及到一系列控制游標的函式,如下:
Screen& MoveUp( );
Screen& MoveDown( );
Screen& MoveLeft( );
Screen& MoveRight( );
看過這四個函式不言而喻,它們是控制游標在螢幕上的位置的,即:向上移動游標,向下移動游標,向左移動游標,向右移動游標。如果我現在把它們寫成重載函式,每個都是Screen& Move( );顯然對於程式設計師來說是不易理解的。因此對於函式重載的使用我們應遵循套用的邏輯,而不是簡單地因為它的存在就必須使用它。程式設計師不應該勉強使用重載函式。
您有沒有想過C++編譯器是如何判斷您調用的是重載中的哪個函式?即使它們的函式名相同。您也許會毫不猶豫的回答:是通過函式的參數表。其實識別的過程並不是像您想像中的那么的容易,其中涉及到參數的等級劃分,參數轉換等諸多方面,下面我就一一進行講解。
假如有下面一組函式:
void S();void S(int);void S(double,double=1.2);void S(constchar*,constchar*);void Max(int,int);//……intmain(){S(2.4);return;}//S(2.4);的調用與S();S(int);S(double,double=1.2);S(constchar*,constchar*),的聲明在同一域,即是可見的。
那么好,問題出現了。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),最後選出最佳可行函式。

相關詞條

熱門詞條

聯絡我們