您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關C++如何實現函數重載的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
函數重載還有一個別名叫函數多態,其實我個人感覺函數多態這個名字更好理解更恰當一些。
函數多態是C++
在C語言基礎上的新特性,它可以讓我們使用多個同名函數。當然這些同名函數的參數是要有區別的,我們在函數調用的時候,編譯器會自動根據我們傳入的參數,從多個同名函數當中找到我們調用的那一個。和面向對象里的多態的概念很接近。
我們在定義函數的時候,編譯器只會查看參數的數目和類型,而不會理會參數的名稱。只要參數的數量以及類型不完全相同,就會被認為是不同的函數。
比如:
void print(const char *str, int width); void print(double d, int width); void print(long l, int width); void print(int i, int width); void print(const char *str);
上面列舉的5個函數它們彼此之間的函數參數的數量和類型都不完全相同,因此會被視為是不同的函數。我們在使用的時候編譯器會根據我們傳入的參數使用對應的函數。
print('pancakes', 15); // use 1 print('pancakes'); // use 5 print(1999.0, 10); // use 2 print(199, 23); // use 4 print(199L, 15); // use 3
這當然沒有問題,如果我們這樣使用呢:
unsigned year = 2021; print(year, 6);
我們可以發現我們這里傳入的參數類型是unsigned int
,它不和任何函數的入參類型匹配。這個時候編譯器并不會放棄,而是會嘗試使用標準類型轉換強制進行匹配。但問題來了,我們有三個版本的函數的第一個入參是數字類型,于是就有了三種變量轉換的方式。這個時候C++
將拒絕這種函數調用,進行報錯。
同樣,一些看起來彼此不同的參數也是不能共存的,比如:
double cube(double x); double cube(double &x);
看起來一個是值傳遞一個是引用傳遞,但是對于編譯器來說,顯然它是無法分辨我們究竟要調用哪一個的。
還有一點需要注意,就是const
修飾符。
void dribble(char *bits); //1 void dribble(const char *bits); //2
dribble
函數有兩個類型,一個用于const
指針,一個用于常規指針,編譯器將會根據實參是否為const
來決定使用哪個函數。因為將非const
值賦給const
變量是合法的,但反之是非法的。
另外,編譯器區分函數是根據函數的參數數量和類型并不是根據函數的返回值。所以下面的兩個聲明是有問題的:
long gronk(int n, float m); double gronk(int n, float m);
因為它們的參數數量以及類型都是一樣的,盡管返回類型不同,但編譯器依然無法區分。
這個問題經常在面試當中出現,面試官會故意挖坑問你,函數重載的依據是什么。如果兩個函數的返回類型不同,但是參數一樣,能不能重載。很多同學對重載的概念記憶不是非常深刻,面試的時候腦子一熱就中招了,所以一定要注意。
感謝各位的閱讀!關于“C++如何實現函數重載”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。