C++ 函數(shù)重載詳情介紹
文章轉(zhuǎn)自微信公眾號(hào):Coder梁(ID:Coder_LT)
函數(shù)重載
函數(shù)重載還有一個(gè)別名叫函數(shù)多態(tài),其實(shí)我個(gè)人感覺函數(shù)多態(tài)這個(gè)名字更好理解更恰當(dāng)一些。
函數(shù)多態(tài)是C++在C語言基礎(chǔ)上的新特性,它可以讓我們使用多個(gè)同名函數(shù)。當(dāng)然這些同名函數(shù)的參數(shù)是要有區(qū)別的,我們?cè)诤瘮?shù)調(diào)用的時(shí)候,編譯器會(huì)自動(dòng)根據(jù)我們傳入的參數(shù),從多個(gè)同名函數(shù)當(dāng)中找到我們調(diào)用的那一個(gè)。和面向?qū)ο罄锏亩鄳B(tài)的概念很接近。
我們?cè)诙x函數(shù)的時(shí)候,編譯器只會(huì)查看參數(shù)的數(shù)目和類型,而不會(huì)理會(huì)參數(shù)的名稱。只要參數(shù)的數(shù)量以及類型不完全相同,就會(huì)被認(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個(gè)函數(shù)它們彼此之間的函數(shù)參數(shù)的數(shù)量和類型都不完全相同,因此會(huì)被視為是不同的函數(shù)。我們?cè)谑褂玫臅r(shí)候編譯器會(huì)根據(jù)我們傳入的參數(shù)使用對(duì)應(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)㈩愋推ヅ?。這個(gè)時(shí)候編譯器并不會(huì)放棄,而是會(huì)嘗試使用標(biāo)準(zhǔn)類型轉(zhuǎn)換強(qiáng)制進(jìn)行匹配。但問題來了,我們有三個(gè)版本的函數(shù)的第一個(gè)入?yún)⑹菙?shù)字類型,于是就有了三種變量轉(zhuǎn)換的方式。這個(gè)時(shí)候C++將拒絕這種函數(shù)調(diào)用,進(jìn)行報(bào)錯(cuò)。
同樣,一些看起來彼此不同的參數(shù)也是不能共存的,比如:
double cube(double x); double cube(double &x);
看起來一個(gè)是值傳遞一個(gè)是引用傳遞,但是對(duì)于編譯器來說,顯然它是無法分辨我們究竟要調(diào)用哪一個(gè)的。
還有一點(diǎn)需要注意,就是const修飾符。
void dribble(char *bits); //1 void dribble(const char *bits); //2
dribble函數(shù)有兩個(gè)類型,一個(gè)用于const指針,一個(gè)用于常規(guī)指針,編譯器將會(huì)根據(jù)實(shí)參是否為const來決定使用哪個(gè)函數(shù)。因?yàn)閷⒎?code>const值賦給const變量是合法的,但反之是非法的。
另外,編譯器區(qū)分函數(shù)是根據(jù)函數(shù)的參數(shù)數(shù)量和類型并不是根據(jù)函數(shù)的返回值。所以下面的兩個(gè)聲明是有問題的:
long gronk(int n, float m); double gronk(int n, float m);
因?yàn)樗鼈兊膮?shù)數(shù)量以及類型都是一樣的,盡管返回類型不同,但編譯器依然無法區(qū)分。
這個(gè)問題經(jīng)常在面試當(dāng)中出現(xiàn),面試官會(huì)故意挖坑問你,函數(shù)重載的依據(jù)是什么。如果兩個(gè)函數(shù)的返回類型不同,但是參數(shù)一樣,能不能重載。很多同學(xué)對(duì)重載的概念記憶不是非常深刻,面試的時(shí)候腦子一熱就中招了,所以一定要注意。
到此這篇關(guān)于C++ 函數(shù)重載詳情介紹的文章就介紹到這了,更多相關(guān)C++ 函數(shù)重載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
QT已有項(xiàng)目導(dǎo)入工程時(shí)注意事項(xiàng)圖文詳解
QT開發(fā)這幾年大大小小項(xiàng)目做了不少,花了點(diǎn)時(shí)間對(duì)知識(shí)點(diǎn)總結(jié)整合了一部分,下面這篇文章主要給大家介紹了關(guān)于QT已有項(xiàng)目導(dǎo)入工程時(shí)注意事項(xiàng)的相關(guān)資料,需要的朋友可以參考下2023-11-11
C/C++ break和continue區(qū)別及使用方法
這篇文章主要介紹了C/C++ break和continue區(qū)別及使用方法的相關(guān)資料,需要的朋友可以參考下2017-07-07
Qt結(jié)合libqrencode生成二維碼的實(shí)現(xiàn)示例
本文主要介紹了Qt結(jié)合libqrencode生成二維碼的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
C語言匯編分析傳遞結(jié)構(gòu)體指針比傳遞結(jié)構(gòu)體變量高效的深層原因
本文章使用的工具是vs2010,本篇文章主要講解結(jié)構(gòu)體指針作為參數(shù)傳遞與結(jié)構(gòu)體變量作為參數(shù)傳遞的對(duì)比,不談值傳遞與址傳遞的概念2022-10-10
C++11 寫一個(gè)只觸發(fā)一次槽函數(shù)的Qt connect函數(shù)
這篇文章主要為大家介紹了C++11 寫一個(gè)只觸發(fā)一次槽函數(shù)的Qt connect函數(shù)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09

