成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳細介紹C++中重載函數的應用

開發 后端
本文介紹的是C++中的重載函數的應用,希望對大家有幫助,一起來看。

之前,我們給大家介紹過C++中的重載運算符,大家可以看看這篇文章,進行了解,《C++基礎之重載運算符的詳細介紹》。今天給大家介紹重載函數

重載函數(overloaded function)是C++支持的一種特殊函數,C++編譯器對函數重載的判斷更是C++語言中最復雜的內容之一

首先我們先明確一下重載函數的定義:在相同的聲明域中的函數名相同的,而參數表不同的,即通過函數的參數表而唯一標識并且來區分函數的一種特殊的函數。

您也許要問,函數為什么要重載呢?何時應該選擇函數重載(function overloading),何時又不呢?這也是我要在下面介紹的。

當將要定義一組函數,使它們執行一系列的操作,但是它們是應用在不同的參數類型上的。此時我們可以選擇重載函數。

例如:

  1. int z_x_max (int,int); //返回兩個整數的***值;  
  2. int ve_max (const vector <int> &); //返回vector容器中的***值;  
  3. int matrix_max (const matrix &); //返回matrix引用的***值; 

 

上面的三個函數都可以大概地說成判斷一組數中的***值,對于函數的用戶來說,他們并不關心函數定義的細節,也就是說他們不關心判斷兩個整數的大小和判斷數組(vector容器)數的大小應該使用不同的函數,而對于程序的設計者來說這可是不得不想到的。程序員必須記住并查找每個函數名。而函數的重載把程序員從這種問題的復雜性中解放了出來,C++提供了這種支持。上面的三個比較大小的函數可以定義成:

 

  1. int Max (int,int); //返回兩個整數的***值;  
  2. int Max (const vector <int> &); //返回vector容器中的***值;  
  3. int Max (const matrix &); //返回matrix引用的***值; 

 

對!通過參數就可以一眼分辨不同的函數。

同時函數的重載也有它不適用的情況。例如:在開發文本編輯器的過程中,會涉及到一系列控制光標的函數,如下:

 

  1. Screen& MoveUp( );  
  2. Screen& MoveDown( );  
  3. Screen& MoveLeft( );  
  4. Screen& MoveRight( ); 

 

看過這四個函數不言而喻,它們是控制光標在屏幕上的位置的,即:向上移動光標,向下移動光標,向左移動光標,向右移動光標。如果我現在把它們寫成重載函數,每個都是Screen& Move( );顯然對于程序員來說是不易理解的。因此對于函數重載的使用我們應遵循應用的邏輯,而不是簡單地因為它的存在就必須使用它。程序員不應該勉強使用重載函數。

您有沒有想過C++編譯器是如何判斷您調用的是重載中的哪個函數?即使它們的函數名相同。您也許會毫不猶豫的回答:是通過函數的參數表。其實識別的過程并不是像您想象中的那么的容易,其中涉及到參數的等級劃分,參數轉換等諸多方面,下面我就一一進行講解。

假如有下面一組函數:

 

  1. void S ( );  
  2. void S ( int );  
  3. void S ( double , double = 1.2 );  
  4. void S ( const char*,const char*);  
  5. void Max ( int , int );  
  6. //……  
  7. int main( )  
  8. {  
  9.  S (2.4);  
  10.  return;  
  11. }  
  12. //S (2.4 );的調用與S ( );   
  13. 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),***選出***可行函數。***可行函數即編譯器要調用的函數。

希望本文能夠給你帶來幫助。

責任編輯:于鐵 來源: 互聯網
相關推薦

2011-07-20 15:58:53

C++引用

2010-01-11 15:21:18

C++語言

2010-01-19 13:43:59

C++函數

2011-07-15 10:08:11

C++運算符重載

2010-01-18 16:56:30

C++函數

2011-07-20 17:04:55

C++虛函數動態聯編

2010-02-05 10:46:10

C++文件流

2020-09-28 08:12:59

CC++時間

2011-07-13 11:34:58

CC++時間函數

2011-07-20 13:40:09

拷貝構造函數

2011-07-15 13:49:30

C++友元函數友元類

2011-07-13 16:49:59

C++

2010-03-24 12:45:00

Python 嵌入

2010-02-01 10:32:01

C++文件操作

2011-06-21 10:17:41

c++內存模型

2011-07-20 13:57:06

C++STL

2010-01-20 17:48:07

C++ 函數重載

2010-02-04 09:33:08

C++指針重載

2011-07-14 16:56:21

2011-07-14 23:27:05

C++引用
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线观看欧美一区 | 欧美国产日韩成人 | 九九热精品视频 | 欧美精品在线播放 | 国产线视频精品免费观看视频 | 99精品免费在线观看 | 九九九久久国产免费 | 久久99精品久久久久久噜噜 | a免费视频 | 国产精品18毛片一区二区 | www.中文字幕 | 一区二区福利视频 | 国产网站在线免费观看 | 成人免费毛片片v | 国产玖玖| 999久久久 | 欧美精品在线播放 | 国产精品成人一区二区三区夜夜夜 | 中文字幕一区二区三区在线视频 | 毛片一区| 一区在线观看视频 | 在线观看免费毛片 | 国产精品中文字幕一区二区三区 | 中文字幕高清 | 99精品国产一区二区青青牛奶 | 日韩一区二区三区在线 | 久久tv在线观看 | 一区二区三区免费在线观看 | 亚洲视频三区 | 色啪网| 欧美爱爱视频 | 干干干日日日 | 在线观看电影av | 伊人网站在线 | 亚洲精品在线免费 | 四虎影院一区二区 | 亚洲欧美一区二区三区国产精品 | 一区二区三区在线观看视频 | 亚洲成人在线视频播放 | 一区二区三区免费看 | 亚洲天堂免费在线 |