C++ 函數(shù)重載詳情介紹
文章轉(zhuǎn)自微信公眾號:Coder梁(ID:Coder_LT)
函數(shù)重載
函數(shù)重載還有一個別名叫函數(shù)多態(tài),其實(shí)我個人感覺函數(shù)多態(tài)這個名字更好理解更恰當(dāng)一些。
函數(shù)多態(tài)是C++
在C語言基礎(chǔ)上的新特性,它可以讓我們使用多個同名函數(shù)。當(dāng)然這些同名函數(shù)的參數(shù)是要有區(qū)別的,我們在函數(shù)調(diào)用的時候,編譯器會自動根據(jù)我們傳入的參數(shù),從多個同名函數(shù)當(dāng)中找到我們調(diào)用的那一個。和面向?qū)ο罄锏亩鄳B(tài)的概念很接近。
我們在定義函數(shù)的時候,編譯器只會查看參數(shù)的數(shù)目和類型,而不會理會參數(shù)的名稱。只要參數(shù)的數(shù)量以及類型不完全相同,就會被認(rèn)為是不同的函數(shù)。
比如:
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個函數(shù)它們彼此之間的函數(shù)參數(shù)的數(shù)量和類型都不完全相同,因此會被視為是不同的函數(shù)。我們在使用的時候編譯器會根據(jù)我們傳入的參數(shù)使用對應(yīng)的函數(shù)。
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
這當(dāng)然沒有問題,如果我們這樣使用呢:
unsigned year = 2021; print(year, 6);
我們可以發(fā)現(xiàn)我們這里傳入的參數(shù)類型是unsigned int
,它不和任何函數(shù)的入?yún)㈩愋推ヅ?。這個時候編譯器并不會放棄,而是會嘗試使用標(biāo)準(zhǔn)類型轉(zhuǎn)換強(qiáng)制進(jìn)行匹配。但問題來了,我們有三個版本的函數(shù)的第一個入?yún)⑹菙?shù)字類型,于是就有了三種變量轉(zhuǎn)換的方式。這個時候C++
將拒絕這種函數(shù)調(diào)用,進(jìn)行報錯。
同樣,一些看起來彼此不同的參數(shù)也是不能共存的,比如:
double cube(double x); double cube(double &x);
看起來一個是值傳遞一個是引用傳遞,但是對于編譯器來說,顯然它是無法分辨我們究竟要調(diào)用哪一個的。
還有一點(diǎn)需要注意,就是const
修飾符。
void dribble(char *bits); //1 void dribble(const char *bits); //2
dribble
函數(shù)有兩個類型,一個用于const
指針,一個用于常規(guī)指針,編譯器將會根據(jù)實(shí)參是否為const
來決定使用哪個函數(shù)。因?yàn)閷⒎?code>const值賦給const
變量是合法的,但反之是非法的。
另外,編譯器區(qū)分函數(shù)是根據(jù)函數(shù)的參數(shù)數(shù)量和類型并不是根據(jù)函數(shù)的返回值。所以下面的兩個聲明是有問題的:
long gronk(int n, float m); double gronk(int n, float m);
因?yàn)樗鼈兊膮?shù)數(shù)量以及類型都是一樣的,盡管返回類型不同,但編譯器依然無法區(qū)分。
這個問題經(jīng)常在面試當(dāng)中出現(xiàn),面試官會故意挖坑問你,函數(shù)重載的依據(jù)是什么。如果兩個函數(shù)的返回類型不同,但是參數(shù)一樣,能不能重載。很多同學(xué)對重載的概念記憶不是非常深刻,面試的時候腦子一熱就中招了,所以一定要注意。
到此這篇關(guān)于C++ 函數(shù)重載詳情介紹的文章就介紹到這了,更多相關(guān)C++ 函數(shù)重載內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!