C++ 函數(shù)重載
同一作用域內(nèi)的幾個函數(shù)名字相同但是形參列表不同的函數(shù)。

編譯器會根據(jù)實(shí)參類型推斷調(diào)用哪個函數(shù)。
注意:main函數(shù)不能重載。
定義重載函數(shù)

像這樣省略了形參的名字,實(shí)際上形參列表是相同的。
不允許兩個函數(shù)除了返回類型不同外其他所有要素相同。

重載和const形參
頂層const不影響傳入函數(shù)的對象,一個擁有頂層const的形參無法和另一個沒有頂層const的形參區(qū)分開來。

如果形參是某種類型的引用或指針,則通過區(qū)分指向的是常量對象還是非常量對象可以實(shí)現(xiàn)函數(shù)的重載,因為此時const是底層的

這是四個函數(shù)。因為const不能轉(zhuǎn)換成其他類型,所以我們只能把const對象傳遞給const形參,相反的,因為非常量可以轉(zhuǎn)換成const,所以上面四個函數(shù)都能作用于非常量對象或非常量對象的指針。當(dāng)我們傳遞一個非常量對象或非常量對象的指針時,編譯器會優(yōu)先選用非常量版本的函數(shù)。
const_cast和重載
前面我們提到過,const_cast在重載函數(shù)的情境中最有用。

這個函數(shù)的參數(shù)和返回類型都是const string的引用,我們可以對兩個非常量的string調(diào)用這個參數(shù),但返回的結(jié)果還是const string的引用,這時我們可以用一個新的函數(shù),如果實(shí)參不是常量時,得到的結(jié)果是一個普通的引用。

這個函數(shù)首先對實(shí)參強(qiáng)制轉(zhuǎn)換為了對const的引用,然后調(diào)用了shorterString函數(shù)的const版本,const版本返回對const string的引用,這個引用事實(shí)上綁定在了某個初始的非常量實(shí)參上,因此我們再將其轉(zhuǎn)換為一個普通的string&上。
調(diào)用重載函數(shù)
大多數(shù)情況下,我們使用實(shí)參去進(jìn)行函數(shù)匹配時非常的容易,但是有一些情況是比較棘手的,例如兩個重載函數(shù)參數(shù)數(shù)量相同且參數(shù)類型可以互相轉(zhuǎn)換時,我們后面就會介紹編譯器如何處理這些函數(shù)。
現(xiàn)在我們需要知道函數(shù)調(diào)用有三種結(jié)果:
1找到一個最佳匹配。
2找不到一個函數(shù)和實(shí)參匹配,也就是無匹配的錯誤。
3有多于一個函數(shù)可以匹配,但是都不是最佳匹配,此時將發(fā)出二義性調(diào)用的錯誤。
重載與作用域
一般來說將函數(shù)聲明寫在局部作用域內(nèi)不是一個好的選擇。
其實(shí)重載對作用域的一般性質(zhì)沒有什么改變,如果我們在內(nèi)層作用域中聲明名字,他將隱藏外層作用域中的同名實(shí)體,在不同作用域中無法重載函數(shù)名。

因為fooBar內(nèi)聲明了print(int),隱藏了之前的print函數(shù),因此只有函數(shù)內(nèi)定義的這個print可用。當(dāng)我們調(diào)用print函數(shù)時,編譯器首先尋找對函數(shù)名的聲明,找到的是接受int值的局部生命,一旦作用域中找到了所需名字,編譯器就會忽略外層作用域中的實(shí)體名字,只檢查是否能和作用域中的參數(shù)是否匹配。
所以名字查找在類型匹配之前發(fā)生。

如果我們把int參數(shù)的print定義在作用域外,那么fooBar將不會再屏蔽其他的print。