6.4 函數重載 | Function overload

函數重載

若同一作用域內幾個函數名字相同但形參列表不同鸣个,可稱之為重載函數。在調用這些函數時編譯器會根據實參類型推斷:

void print(const char* cp);
print("Hello");

void print(const int* beg, const int* end);
print(j, end(j)-begin(j));

void print(const int ia[], size_t size);
print(begin(j), end(j))

定義重載函數

不允許定義兩個含有相同參數列表但返回類型不同的函數。

判斷形參類型是否相異

允許存在形參列表不同但實際相同的函數:

int a(const int& i);
int a(const int&);

int a(const int* i);
int a(const int* j);

重載和const形參

頂層const不影響傳入函數的對象对粪,一個含有頂層const的形參和同名非const形參不做區(qū)分:

int a(const int i);
int a(int i); //重復定義

若形參是復合類型仿吞,則const作為底層const可被區(qū)分:

int a(const int& i);
int a(int& i);  //合理

int a(const int* i);
int a(int* i);  //合理

const_cast和重載

const_cast在重載函數的情況下最有用。例如:

const string &shorterString(const string& s1, const string& s2{
    return s1.size() <= s2.size() ? s1 : s2;
}

該函數只能接受const string類型的實參并且將其返回淳地,而為了實現對非const類型的支持怖糊,可以通過以下方式重載;

const string &shorterString(string& s1, string& s2){
    // 將實參強制轉換后裝入接受兩個const的函數:
    auto &r = shorterString(const_cast<const string&>(s1), 
                            const_cast<const string&>(s2));
    // 返回非const的類型:
    return const_cast<string&>(r);
}

調用重載的函數

定義了一組重載函數后需要以合理的實參進行調用。
函數匹配 function matching過程中把函數調用與一組重載函數中的某一個關聯(lián)起來颇象,函數匹配也叫做重載確定 overload resolution伍伤。編譯器首先將調用的實參與重載集合中每一個函數的形參進行比較,然后根據比較結果確定到底調用哪一個遣钳。

調用重載函數時的可能結果:

  • 編譯器找到一個與實參的最佳匹配 best match扰魂,并生成調用代碼;
  • 找不到任何可匹配的函數蕴茴,編譯器發(fā)出無匹配 no match的錯誤劝评;
  • 二義性調用 ambiguous call 無最佳匹配同樣會報錯。

重載與作用域

如果在內層作用域聲明函數名倦淀,則外層作用域中聲明的同名實體將被隱藏

string read();
void print(const string&);
void print(double);
void foo(int val){
    bool read = false;  //內層聲明蒋畜,隱藏外層的read
    string s = read();  //錯誤:read為bool值
    void print(int);    //新作用域,將之前的全部隱藏
    print("Hello");     //自然會報錯
    print(val);         //正確撞叽,在該作用域中可見百侧。
}

C++中,名字查找發(fā)生在類型檢查之前能扒。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末佣渴,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子初斑,更是在濱河造成了極大的恐慌辛润,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異砂竖,居然都是意外死亡真椿,警方通過查閱死者的電腦和手機狐粱,發(fā)現死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門琅翻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來牛欢,“玉大人匕累,你說我怎么就攤上這事∫嘉粒” “怎么了纳胧?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵挂捅,是天一觀的道長浙于。 經常有香客問我护盈,道長,這世上最難降的妖魔是什么羞酗? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任腐宋,我火速辦了婚禮,結果婚禮上檀轨,老公的妹妹穿的比我還像新娘胸竞。我一直安慰自己,他們只是感情好参萄,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布卫枝。 她就那樣靜靜地躺著,像睡著了一般拧揽。 火紅的嫁衣襯著肌膚如雪剃盾。 梳的紋絲不亂的頭發(fā)上腺占,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天淤袜,我揣著相機與錄音,去河邊找鬼衰伯。 笑死铡羡,一個胖子當著我的面吹牛,可吹牛的內容都是我干的意鲸。 我是一名探鬼主播烦周,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼怎顾!你這毒婦竟也來了读慎?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤槐雾,失蹤者是張志新(化名)和其女友劉穎夭委,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體募强,經...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡株灸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年崇摄,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片慌烧。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡逐抑,死狀恐怖,靈堂內的尸體忽然破棺而出屹蚊,到底是詐尸還是另有隱情厕氨,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布淑翼,位于F島的核電站腐巢,受9級特大地震影響,放射性物質發(fā)生泄漏玄括。R本人自食惡果不足惜冯丙,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望遭京。 院中可真熱鬧胃惜,春花似錦、人聲如沸哪雕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽斯嚎。三九已至利虫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間堡僻,已是汗流浹背糠惫。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留钉疫,地道東北人硼讽。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像牲阁,于是被迫代替她去往敵國和親固阁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內容

  • 函數是一個命了名的代碼塊城菊,我們通過調用函數執(zhí)行相應的代碼备燃。函數可以有零個或者多個參數,而且(通常)會產生一個結果凌唬。...
    丶不霽何虹閱讀 1,154評論 0 1
  • 函數基礎 函數調用完成兩項工作:一是實參初始化函數對應的形參并齐,二是將控制權轉移給被調用函數。此時主調函數的執(zhí)行被暫...
    TOMOCAT閱讀 355評論 0 1
  • 6.1 函數基礎 6.1.1 局部對象 函數參數:實參是函數中形參的初始值,存在對應關系冀膝,但并沒有規(guī)定實參的求值順...
    咸魚翻身ing閱讀 264評論 0 0
  • 大多數類型都能用作函數的返回類型唁奢,一種特殊的返回類型是void,它表示函數不返回任何值窝剖。函數的返回類型不能是數組類...
    夢中睡覺的巴子閱讀 279評論 0 0
  • C++ Primer 第五版 第188頁 值參數和引用參數當初始化一個非引用類型的變量時麻掸,初始值被拷貝給變量,對變...
    居者有其屋閱讀 179評論 0 0