https://m./group/6811767114609721867/?app=news_article×tamp=1586016879&req_id=2020040500143901002607707930728BA9&group_id=6811767114609721867 在實際開發(fā)中,有時候我們需要實現(xiàn)幾個功能類似的函數(shù),,只是有些細節(jié)不同,。例如希望交換兩個變量的值,這兩個變量有多種類型,,可以是 int,、float、char,、bool 等,,我們需要通過參數(shù)把變量的地址傳入函數(shù)內(nèi)部。在C語言中,,程序員往往需要分別設(shè)計出三個不同名的函數(shù),,其函數(shù)原型與下面類似: void swap1(int *a, int *b); //交換 int 變量的值 void swap2(float *a, float *b); //交換 float 變量的值 void swap3(char *a, char *b); //交換 char 變量的值 void swap4(bool *a, bool *b); //交換 bool 變量的值 但在C++中,這完全沒有必要,。C++ 允許多個函數(shù)擁有相同的名字,,只要它們的參數(shù)列表不同就可以,這就是函數(shù)的重載(Function Overloading),。借助重載,,一個函數(shù)名可以有多種用途。 參數(shù)列表又叫參數(shù)簽名,,包括參數(shù)的類型,、參數(shù)的個數(shù)和參數(shù)的順序,只要有一個不同就叫做參數(shù)列表不同,?!臼纠拷柚瘮?shù)重載交換不同類型的變量的值:
運行結(jié)果: 本例之所以使用Swap這個函數(shù)名,而不是使用swap,,是因為 C++ 標準庫已經(jīng)提供了交換兩個變量的值的函數(shù),,它的名字就是swap,位于algorithm頭文件中,,為了避免和標準庫中的swap沖突,,本例特地將S大寫。 既然標準庫已經(jīng)提供了 swap() 函數(shù),,本例為何又要自己實現(xiàn)一遍呢,,這不是費力不討好嗎?交換兩個變量的值是一個經(jīng)典且實用的函數(shù)重載案例,本例這樣做僅僅是為了教學(xué)演示,,并不是要替代標準庫中的 swap(),,讀者在以后的編碼過程中也應(yīng)該堅持使用標準庫中的 swap()。 通過本例可以發(fā)現(xiàn),,重載就是在一個作用范圍內(nèi)(同一個類,、同一個命名空間等)有多個名稱相同但參數(shù)不同的函數(shù)。重載的結(jié)果是讓一個函數(shù)名擁有了多種用途,,使得命名更加方便(在中大型項目中,,給變量、函數(shù),、類起名字是一件讓人苦惱的問題),,調(diào)用更加靈活。 在使用重載函數(shù)時,,同名函數(shù)的功能應(yīng)當相同或相近,,不要用同一函數(shù)名去實現(xiàn)完全不相干的功能,雖然程序也能運行,,但可讀性不好,,使人覺得莫名其妙。 注意,,參數(shù)列表不同包括參數(shù)的個數(shù)不同,、類型不同或順序不同,僅僅參數(shù)名稱不同是不可以的,。函數(shù)返回值也不能作為重載的依據(jù)。
C++ 是如何做到函數(shù)重載的C++代碼在編譯時會根據(jù)參數(shù)列表對函數(shù)進行重命名,,例如void Swap(int a, int b)會被重命名為_Swap_int_int,,void Swap(float x, float y)會被重命名為_Swap_float_float。當發(fā)生函數(shù)調(diào)用時,,編譯器會根據(jù)傳入的實參去逐個匹配,,以選擇對應(yīng)的函數(shù),如果匹配失敗,,編譯器就會報錯,,這叫做重載決議(Overload Resolution)。 不同的編譯器有不同的重命名方式,這里僅僅舉例說明,,實際情況可能并非如此,。 從這個角度講,函數(shù)重載僅僅是語法層面的,,本質(zhì)上它們還是不同的函數(shù),,占用不同的內(nèi)存,入口地址也不一樣,。 隱式類型轉(zhuǎn)換導(dǎo)致重載函數(shù)二義性的問題例如函數(shù)形參的類型是int,,調(diào)用函數(shù)時卻將short類型的數(shù)據(jù)交給了它,編譯器就需要先將short類型轉(zhuǎn)換為int類型才能匹配成功,。 注意,,類型提升和類型轉(zhuǎn)換不是一碼事!類型提升是積極的,,是為了更加高效地利用計算機硬件,,不會導(dǎo)致數(shù)據(jù)丟失或精度降低;而類型轉(zhuǎn)換是不得已而為之,,不能保證數(shù)據(jù)的正確性,,也不能保證應(yīng)有的精度。 函數(shù)重載二義性錯誤代碼示例: #include <iostream>using namespace std;void func(int, int) {};void func(char, int, float) {};void func(char, long, double) {};int main() { short n = 99; func(n, n); func('@', n, 99); func('@', n, 99.5); //二義性錯誤 getchar(); return 0;} VS報錯提示: 所以,,大家在寫函數(shù)重載時一定要注意,,還有一個問題,函數(shù)重載和默認參數(shù)一起使用時也可能出問題,,請大家多多實踐 尾言文章都是手打原創(chuàng),,每天最淺顯的介紹C語言、C++,,windows知識,,喜歡我的文章就關(guān)注一波吧,可以看到最新更新和之前的文章哦,。如果足下基礎(chǔ)比較差,,不妨關(guān)注下人人都可以學(xué)習(xí)的視頻教程 通俗易懂,深入淺出,,一個視頻只講一個知識點,。視頻不深奧,不需要鉆研,,在公交,、在地鐵、在廁所都可以觀看,,隨時隨地漲姿勢 |
|