深入剖析C 過載函式的應用

2021-04-12 21:45:13 字數 2407 閱讀 7015

簡單剖析c++過載函式的應用 最近我在為我的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 ( const char*,const char*);

void max ( int , int ); //…… int main( )   //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),最後選出最佳可行函式。

C 中虛函式深入剖析

虛函式 虛函式 虛函式位址表 虛表 vtable 每個類中含有虛函式的物件,編譯器都會為它們指定乙個虛表 其實是乙個函式指標陣列 儲存在資料區,它由此類所有的物件共用 即靜態的 同時編譯器也會為它 每個類物件 加上乙個成員變數,乙個指向自己虛表的指標 常稱為 vptr 並存放在物件的首位址上,由此每...

深入理解C 過載函式

深入理解c 過載函式 1.定義 c 允許在同一範圍中宣告幾個功能類似的同名函式,但是這些同名函式的形式引數 指引數的個數 型別或者順序 必須不同,即函式的引數列表不同,也就是說用同乙個運算子完成不同的運算功能。這就是過載函式。過載函式常用來實現功能類似而所處理的資料型別不同的問題。2.好處 函式過載...

C 高階剖析(六 )之函式過載

1.1 函式過載 1.1.1 滿足條件 1.1.2 函式過載 1.1.3 例項 include include include intfunc int a int b intfunc int a intfunc const char a intmain 1.1.4 函式引數遇上預設引數會怎樣 錯誤程...