對於C++中函數的重載,我們先來看看下面的幾行代碼:
很簡單的兩個函數,我們可以發現,其實這兩個函數都是爲了實現同一個功能:判斷形參是正數還是負數,如果是正數則返回自己,如果是負數則返回相反數。
功能一樣的函數卻因爲形參的不同要弄出兩個函數來,顯然有點囉嗦了,所以爲了提高代碼的簡潔,C++提出了函數重載功能。
我們先來看看怎樣才能實現函數重載:
1.函數名相同
2.參數的個數、類型、排序不相同
3.返回值的類型不同不能構成重載
實踐是檢驗真理的唯一標準,那麼我們來看看代碼吧!
這段代碼中,我們定義了兩個同名函數,它們不但沒有被報錯,反而還能正常地執行。我們發現,其實它們真正的不同也只有形參的類型不同(printf函數裏隨便輸出的就忽略了)。
從打印的結果我們可以發現,當形參是整數時,自動調用了形參是整數的那個函數,而當形參是2.5時,就調用了下面的print函數。
其實print函數是實現了重載!
我們再往下看:
3個print由於形參的類型或形參的個數或排列方式的不同,構成了C++偉大的函數重載。
我們還說,函數的返回值不同不能構成函數重載,我們來試一試:
代碼編譯出錯了,ambiguating就是二義性的意思。
函數重載遵循嚴格的調用匹配原則,這點我們需要特別注意。
匹配原則:
1.嚴格匹配,找到則調用
2.通過隱式轉換尋求一個匹配,找到則調用
例如:
我們知道‘a’是個字符,它通過隱式轉換尋找到了int,所以程序調用了第一個print函數。
我們需要注意的是,C++允許,int到long和double,double到int和float的隱式類型轉換,遇到這種情形,則會引起二義性。
上面的代碼都編譯錯誤了,因爲對於int可以隱式轉換成long或者double,double可以隱式轉換成int和float,計算機不知道選擇哪個函數來實現,所以就報錯了。
Kyrie Irving___全.