如果同一作用域內(nèi)的幾個函數(shù)名字相同但形參列表不同,我們稱之為重載函數(shù)。
這些函數(shù)接受的形參類型不一樣,但是執(zhí)行的操作非常類似畦浓,當(dāng)調(diào)用這些函數(shù)時,編譯器會根據(jù)傳遞的實(shí)參類型推斷想要的是哪個函數(shù)检疫。
函數(shù)的名字僅僅是讓編譯器知道它調(diào)用的是哪個函數(shù)讶请,而函數(shù)重載可以在一定程度上減輕起名字記名字的痛苦。
當(dāng)有一種數(shù)據(jù)庫應(yīng)用屎媳,需要創(chuàng)建幾種不同的函數(shù)夺溢,此時函數(shù)重載可以定義一組函數(shù),它們的名字都是 lookup 但是查找的依據(jù)不同剿牺。
三個函數(shù)各不相同企垦,但都是同一個名字。編譯器根據(jù)實(shí)參的類型確定應(yīng)該調(diào)用哪一個函數(shù)晒来。
重載函數(shù)應(yīng)該在形參數(shù)量或形參類型上有所不同钞诡。
不允許兩個函數(shù)除了返回類型外其它所有的要素都相同。
頂層的 const 不影響傳入函數(shù)的對象湃崩,一個擁有頂層 const 的形參無法和另一個沒有頂層 const 的形參區(qū)分開了荧降。
如果形參是某種類型的指針或引用,則通過區(qū)分其指向的事常量對象還是非常量對象可以實(shí)現(xiàn)函數(shù)重載攒读,此時的 const 是底層朵诫。
const_casr 在重載函數(shù)的情境中最有用。
這個函數(shù)的參數(shù)和返回類型都是 const string 的引用薄扁,可以對兩個非常量的 string 實(shí)參調(diào)用這個函數(shù)剪返,但返回的結(jié)果仍是 const string 的引用废累。因此需要一種新的 shorterString 函數(shù)。
當(dāng)它的實(shí)參不是常量時脱盲,得到的結(jié)果是一個普通的引用邑滨,此時使用 const_cast 。
首先將實(shí)參強(qiáng)制轉(zhuǎn)換成對 const 的引用钱反,然后調(diào)用 shorterString 函數(shù)的 const 版本掖看。const 版本返回對 const string 的引用,這個引用事實(shí)上綁定在某個初始的非常量實(shí)參上面哥。所有可以再將其轉(zhuǎn)換回一個普通的 string& 。
定義一組重載函數(shù)后,我們需要以合理的實(shí)參調(diào)用它們蹲坷。函數(shù)匹配是指一個過程,在這個過程中我們把函數(shù)調(diào)用與一組重載函數(shù)中的某一個關(guān)聯(lián)起來邑飒,函數(shù)匹配也叫做重載確定。
編譯器首先將調(diào)用的實(shí)參與重載集合中每一個函數(shù)的形參進(jìn)行比較撒轮,然后根據(jù)比較的結(jié)果決定到底調(diào)用那個函數(shù)。
當(dāng)調(diào)用重載函數(shù)時有三種可能的結(jié)果:
1顶瞳、編譯器找到一個與實(shí)參最佳匹配的函數(shù),并生成調(diào)用該函數(shù)的代碼符喝。
2协饲、找不到任何一個函數(shù)與調(diào)用的實(shí)參匹配描馅,此時編譯器發(fā)出無匹配的錯誤信息。
3况凉、有多于一個函數(shù)可以匹配刁绒,但是每一個都不是明顯的最佳選擇。此時也將發(fā)生錯誤嫂丙。稱為二義性調(diào)用。
重載對于作用域的一般性質(zhì)沒有什么改變隅肥,如果我們在內(nèi)層作用域中聲明名字,它將隱藏外層作用域中聲明的同名實(shí)體。在不同的作用域中無法重載函數(shù)名伍纫。