C++缺省參數(shù)與重載函數(shù)(超詳細(xì)!)
本篇文章主要講述c++中有關(guān)于缺少參數(shù)與函數(shù)重載的相關(guān)概念與實(shí)例,以下是本人拙見,如有錯誤敬請指教。
一.缺省參數(shù)
1.1缺省參數(shù)概念
缺省參數(shù)就是聲明和定義函數(shù)時(shí)為函數(shù)的參數(shù)指定一個缺省值
簡而言之就是應(yīng)對沒有傳實(shí)參時(shí)的一種保底手段,若沒有傳實(shí)參缺省參數(shù)就會用自己的初始化數(shù)值,傳實(shí)參則用實(shí)參的值忽略缺省值。
#include <iostream> using namespace std; void fun(int a = 0) { cout << a << endl; } int main() { int a = 1; fun(); fun(a); return 0; }
1.2缺省參數(shù)分類
- 全缺省參數(shù)
顧名思義,對所有形參進(jìn)行初始化
void fun(int a = 0,int b = 0,int c= 0) { cout << a << b << c << endl; } int main() { int a = 1; int b = 2; int c = 3; fun(); fun(a, b, c); return 0; }
- 半缺省參數(shù)
對一部分形參進(jìn)行初始化
void fun(int a, int b = 0, int c = 0) { cout << a << b << c << endl; } int main() { int a = 1; int b = 2; int c = 3; fun(a,b); fun(a, b, c); return 0; }
注意事項(xiàng):
- 半缺省參數(shù)必須從右往左依次給出,不能間隔著給
如果是從左往右給出,那么會出現(xiàn)以下兩種情況:
為了確保形參C能夠接受到數(shù)值必須占用一個實(shí)參,那么1的指向反而亂套了無論是給a還是b都可以。
而從右往左就不會出現(xiàn)這種情況。這里就像是五線譜,實(shí)參與形參的位置順序都是一一對應(yīng)的。
- 缺省參數(shù)不能在聲明和定義中同時(shí)出現(xiàn) (只能在聲明中用)
//a.h void fun(int a = 1); //a.cpp void fun(int a = 2) { }
這樣編譯器無法確定該用哪個值
- 缺省值必須是全局變量或常量
- C語言不支持
二.函數(shù)重載
2.1函數(shù)重載概念
即在同一作用域下——功能類似的同名函數(shù)(參數(shù)個數(shù)、類型、類型順序不同),通俗點(diǎn)就是一詞多義。
//參數(shù)類型不同 int fun1(int a, int b) { cout << "fun1(int a,int b)" << endl; return a + b; } double fun1(double a, double b) { cout << "fun1(double a,double b)" << endl; return a + b; } //參數(shù)個數(shù)不同 void fun2() { cout << "fun2()" << endl; } void fun2(int a) { cout << "fun2(int a)" << endl; } //類型順序不同 void fun3(int a, char b) { cout << "fun3(int a,char b)" << endl; } void fun3(char b,int a) { cout << "fun3(char b,int a)" << endl; } int main() { fun1(10,20); fun1(10.1, 20.2); fun2(); fun2(10); fun3(10, 'a'); fun3('a',10); return 0; }
上述例子可以看到在有多個同名函數(shù)的情況下,編譯器會根據(jù)參數(shù)個數(shù)、類型、類型順序 進(jìn)行相應(yīng)的匹配。
不過當(dāng)我們所用的實(shí)參對應(yīng)不到相關(guān)的同名函數(shù)時(shí)就會報(bào)錯。
確實(shí)是可以隱式轉(zhuǎn)換,問題是int轉(zhuǎn)double還是double轉(zhuǎn)int呢?所以有時(shí)候存在多個重載函數(shù)時(shí)反而會有歧義。這時(shí)候只要去掉其中一個重載就可以隱式轉(zhuǎn)換了。
我們再結(jié)合缺省參數(shù)時(shí)不傳實(shí)參的重載函數(shù)也會發(fā)生歧義,編譯器也不知道要調(diào)用哪個重載函數(shù)了,這種情況也需要注意。
函數(shù)重載有利有弊吧,方便的同時(shí)也是要付出一些代價(jià)的~
2.2c++支持函數(shù)重載原理——命名修飾
在c/c++中一個程序要運(yùn)行起來,需要經(jīng)歷以下階段:預(yù)處理——編譯——匯編——鏈接
- 預(yù)處理:生成Fun.i與Test.i文件,其中前者包含聲明與定義,而后者只有Fun.h聲明沒有定義。
- 編譯:生成Fun.s與Test.s文件,其中由main函數(shù)進(jìn)行調(diào)用相關(guān)函數(shù),但由于Test.i中的main函數(shù)只包含聲明并沒有定義,這意味著call不到地址,在這種情況下編譯器只能先對照聲明是否匹配,就算聲明匹配成功這也只能算是個承諾先放你到下一階段,最后還是要查地址的。
- 匯編:生成Fun.o與Test.o文件
- 鏈接:合并到一起并解決無法確定函數(shù)地址的問題,由于c語言在該階段會生成一個符號表,可以在此去尋找函數(shù)名字與地址進(jìn)一步驗(yàn)證之前的承諾。但c++不同,它不會生成符號表,而是有一套獨(dú)特的命名規(guī)則。
歸根結(jié)底就是在編譯的時(shí)候c與c++都一樣會有無法直接找到地址的問題,只不過最后在鏈接的時(shí)候雙方的處理方式不同,c語言靠符號表,而c++靠獨(dú)特的函數(shù)命名修飾原則。
這是在linux環(huán)境下由gcc編譯完成的命名修飾樣例。
當(dāng)然我們不用這么去細(xì)究這些,只需要知道函數(shù)重載中是c++特有的即可。
總結(jié)
到此這篇關(guān)于C++缺省參數(shù)與重載函數(shù)的文章就介紹到這了,更多相關(guān)C++缺省參數(shù)與重載函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C/C++開發(fā)中extern的一些使用注意事項(xiàng)
這篇文章主要為大家介紹了C/C++開發(fā)中extern一些使用注意事項(xiàng)的事例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01C++ 解引用與函數(shù)基礎(chǔ)詳解之內(nèi)存地址、調(diào)用方法及聲明
函數(shù)是C++ 中重要的編程概念,它們可以提高代碼的可重用性、可讀性和可維護(hù)性,本文介紹C++ 解引用與函數(shù)基礎(chǔ)詳解之內(nèi)存地址、調(diào)用方法及聲明,感興趣的朋友跟隨小編一起看看吧2024-04-04C語言中system()執(zhí)行cmd命令打開關(guān)閉程序的方法
今天小編就為大家分享一篇C語言中system()執(zhí)行cmd命令打開關(guān)閉程序的方法。具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05讓應(yīng)用程序只運(yùn)行一個實(shí)例的實(shí)現(xiàn)方法
我們在使用《360軟件管家》時(shí)發(fā)現(xiàn),在《360軟件管家》已經(jīng)運(yùn)行了的情況下,再次點(diǎn)擊《360軟件管家》的圖標(biāo),那么它不會再運(yùn)行另外一個《360軟件管家》,而是將已有的《360軟件管家》給激活,始終只能運(yùn)行一個《360軟件管家》的實(shí)例2013-05-05項(xiàng)目之C++如何實(shí)現(xiàn)數(shù)據(jù)庫連接池
這篇文章主要介紹了項(xiàng)目之C++如何實(shí)現(xiàn)數(shù)據(jù)庫連接池問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03