C++缺省參數(shù)與重載函數(shù)(超詳細(xì)!)
本篇文章主要講述c++中有關(guān)于缺少參數(shù)與函數(shù)重載的相關(guān)概念與實(shí)例,以下是本人拙見(jiàn),如有錯(cuò)誤敬請(qǐng)指教。
一.缺省參數(shù)
1.1缺省參數(shù)概念
缺省參數(shù)就是聲明和定義函數(shù)時(shí)為函數(shù)的參數(shù)指定一個(gè)缺省值
簡(jiǎn)而言之就是應(yīng)對(duì)沒(méi)有傳實(shí)參時(shí)的一種保底手段,若沒(méi)有傳實(shí)參缺省參數(shù)就會(huì)用自己的初始化數(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ù)
顧名思義,對(duì)所有形參進(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ù)
對(duì)一部分形參進(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ù)必須從右往左依次給出,不能間隔著給
如果是從左往右給出,那么會(huì)出現(xiàn)以下兩種情況:

為了確保形參C能夠接受到數(shù)值必須占用一個(gè)實(shí)參,那么1的指向反而亂套了無(wú)論是給a還是b都可以。

而從右往左就不會(huì)出現(xiàn)這種情況。這里就像是五線譜,實(shí)參與形參的位置順序都是一一對(duì)應(yīng)的。
- 缺省參數(shù)不能在聲明和定義中同時(shí)出現(xiàn) (只能在聲明中用)
//a.h
void fun(int a = 1);
//a.cpp
void fun(int a = 2)
{
}這樣編譯器無(wú)法確定該用哪個(gè)值
- 缺省值必須是全局變量或常量
- C語(yǔ)言不支持
二.函數(shù)重載
2.1函數(shù)重載概念
即在同一作用域下——功能類似的同名函數(shù)(參數(shù)個(gè)數(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ù)個(gè)數(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;
}
上述例子可以看到在有多個(gè)同名函數(shù)的情況下,編譯器會(huì)根據(jù)參數(shù)個(gè)數(shù)、類型、類型順序 進(jìn)行相應(yīng)的匹配。
不過(guò)當(dāng)我們所用的實(shí)參對(duì)應(yīng)不到相關(guān)的同名函數(shù)時(shí)就會(huì)報(bào)錯(cuò)。

確實(shí)是可以隱式轉(zhuǎn)換,問(wèn)題是int轉(zhuǎn)double還是double轉(zhuǎn)int呢?所以有時(shí)候存在多個(gè)重載函數(shù)時(shí)反而會(huì)有歧義。這時(shí)候只要去掉其中一個(gè)重載就可以隱式轉(zhuǎn)換了。
我們?cè)俳Y(jié)合缺省參數(shù)時(shí)不傳實(shí)參的重載函數(shù)也會(huì)發(fā)生歧義,編譯器也不知道要調(diào)用哪個(gè)重載函數(shù)了,這種情況也需要注意。

函數(shù)重載有利有弊吧,方便的同時(shí)也是要付出一些代價(jià)的~
2.2c++支持函數(shù)重載原理——命名修飾
在c/c++中一個(gè)程序要運(yùn)行起來(lái),需要經(jīng)歷以下階段:預(yù)處理——編譯——匯編——鏈接

- 預(yù)處理:生成Fun.i與Test.i文件,其中前者包含聲明與定義,而后者只有Fun.h聲明沒(méi)有定義。
- 編譯:生成Fun.s與Test.s文件,其中由main函數(shù)進(jìn)行調(diào)用相關(guān)函數(shù),但由于Test.i中的main函數(shù)只包含聲明并沒(méi)有定義,這意味著call不到地址,在這種情況下編譯器只能先對(duì)照聲明是否匹配,就算聲明匹配成功這也只能算是個(gè)承諾先放你到下一階段,最后還是要查地址的。
- 匯編:生成Fun.o與Test.o文件
- 鏈接:合并到一起并解決無(wú)法確定函數(shù)地址的問(wèn)題,由于c語(yǔ)言在該階段會(huì)生成一個(gè)符號(hào)表,可以在此去尋找函數(shù)名字與地址進(jìn)一步驗(yàn)證之前的承諾。但c++不同,它不會(huì)生成符號(hào)表,而是有一套獨(dú)特的命名規(guī)則。
歸根結(jié)底就是在編譯的時(shí)候c與c++都一樣會(huì)有無(wú)法直接找到地址的問(wèn)題,只不過(guò)最后在鏈接的時(shí)候雙方的處理方式不同,c語(yǔ)言靠符號(hào)表,而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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言實(shí)例真題講解數(shù)據(jù)結(jié)構(gòu)中單向環(huán)形鏈表
鏈表可以說(shuō)是一種最為基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)了,而單向鏈表更是基礎(chǔ)中的基礎(chǔ)。鏈表是由一組元素以特定的順序組合或鏈接在一起的,不同元素之間在邏輯上相鄰,但是在物理上并不一定相鄰。在維護(hù)一組數(shù)據(jù)集合時(shí),就可以使用鏈表,這一點(diǎn)和數(shù)組很相似2022-04-04
C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易的掃雷游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易的掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
C語(yǔ)言算法練習(xí)之求二維數(shù)組最值問(wèn)題
這篇文章主要為大家介紹了C語(yǔ)言算法練習(xí)中求二維數(shù)組最值的實(shí)現(xiàn)方法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C語(yǔ)言有一定幫助,需要的可以參考一下2022-09-09
C++?STL容器詳解之紅黑樹(shù)部分模擬實(shí)現(xiàn)
本文主要對(duì)紅黑樹(shù)進(jìn)行了詳細(xì)介紹,并對(duì)其核心功能進(jìn)行了模擬實(shí)現(xiàn)。文中的代碼對(duì)我們的學(xué)習(xí)或工作有一定的價(jià)值,感興趣的小伙伴可以了解一下2021-12-12
在QT5中實(shí)現(xiàn)求兩個(gè)輸入值的和并輸出(實(shí)例)
下面小編就為大家?guī)?lái)一篇在QT5中實(shí)現(xiàn)求兩個(gè)輸入值的和并輸出(實(shí)例)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
C語(yǔ)言實(shí)現(xiàn)Fibonacci數(shù)列遞歸
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)Fibonacci數(shù)列遞歸,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
C++?OpenCV技術(shù)實(shí)戰(zhàn)之身份證離線識(shí)別
OpenCV身份證離線識(shí)別技術(shù)的主要技術(shù)就是通過(guò)OpenCV找到身份證號(hào)碼區(qū)域,然后通過(guò)OCR進(jìn)行數(shù)字識(shí)別該區(qū)域的截圖即可得到身份證號(hào)碼。感興趣的可以了解一下2021-12-12
C++實(shí)現(xiàn)簡(jiǎn)單的ls命令及其原理
這篇文章主要介紹了C++實(shí)現(xiàn)簡(jiǎn)單的ls命令及其原理,C++實(shí)現(xiàn)ls命令可通過(guò)調(diào)用系統(tǒng)函數(shù)實(shí)現(xiàn)讀取目錄中的文件名和屬性,再通過(guò)標(biāo)準(zhǔn)輸出進(jìn)行顯示,需要的朋友可以參考下2023-05-05

