課程
/后端開發(fā)
/C++
/C++遠(yuǎn)征之離港篇
函數(shù)重載的對參數(shù)的要求是:參數(shù)個數(shù)不同,參數(shù)類型不同,它們是和還是或的關(guān)系?
2015-06-20
源自:C++遠(yuǎn)征之離港篇 4-2
正在回答
或的關(guān)系。
但注意這里有坑:
函數(shù)在傳參時,參數(shù)是可以進(jìn)行自動轉(zhuǎn)換的。假如調(diào)用函數(shù)時傳的參數(shù)類型沒有完全匹配任何一個可重載函數(shù),而且都可以進(jìn)行類型轉(zhuǎn)換的話,編譯器會報歧義錯誤的。
GameDesigner_DaC 提問者
onemoo 回復(fù) GameDesigner_DaC 提問者
確實(shí)有可能造成歧義。
這兩個基本規(guī)則是“或”的關(guān)系。但編譯器會需要更多的信息來確定到底調(diào)用哪個函數(shù),步驟為:
1. 先確定同名函數(shù)都有哪些,并且是在調(diào)用點(diǎn)“可見的”,這些函數(shù)就是“候選函數(shù)”。
2. 判斷每一個候選函數(shù)的參數(shù)是否滿足你的調(diào)用參數(shù)(不考慮返回值類型),這些選出的函數(shù)被稱為“可行函數(shù)”。這里面就包括參數(shù)數(shù)量不同但擁有默認(rèn)參數(shù)值的參數(shù)。 如果根本就選不出來,就直接報錯。
3. 如果可行函數(shù)不止一個,那么就看有沒有哪個函數(shù)的參數(shù)類型可以“完全”匹配調(diào)用參數(shù)類型,有的話就選它。 如果都需要進(jìn)行參數(shù)轉(zhuǎn)換,那么就有歧義,編譯器會報錯。
比如重載了函數(shù)fun:
void?fun(int);?//?#1 void?fun(int,?int);?//?#2 void?fun(double,?double?=?1.0);?//?#3
當(dāng)你這樣調(diào)用:func(1.0); 就會調(diào)用第三個fun。 ?首先第二個fun會被排除掉,第一個和第三個fun會成為“可行函數(shù)”,但是第三個fun的第一個參數(shù)類型能完全匹配1.0,而第一個fun得需要進(jìn)行參數(shù)類型轉(zhuǎn)換。
但如果你這樣調(diào)用: fun(1); 會調(diào)用第一個fun,這時可行函數(shù)仍為#1和#3,但是第一個可以完全匹配參數(shù)類型。
可如果你這樣調(diào)用: fun(1, 1.0); 就會造成歧義,因為兩個可行函數(shù)(#2和#3)都有參數(shù)需要進(jìn)行類型轉(zhuǎn)換,編譯器不知道調(diào)用哪個“更好”。
重載的條件就是函數(shù)名相同,參數(shù)列表不同。
舉報
C++掃清通往面向?qū)ο蟮淖詈笠坏勒系K,將所有知識點(diǎn)融會貫通
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網(wǎng)安備11010802030151號
購課補(bǔ)貼聯(lián)系客服咨詢優(yōu)惠詳情
慕課網(wǎng)APP您的移動學(xué)習(xí)伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號
2015-06-20
或的關(guān)系。
但注意這里有坑:
函數(shù)在傳參時,參數(shù)是可以進(jìn)行自動轉(zhuǎn)換的。假如調(diào)用函數(shù)時傳的參數(shù)類型沒有完全匹配任何一個可重載函數(shù),而且都可以進(jìn)行類型轉(zhuǎn)換的話,編譯器會報歧義錯誤的。
2015-06-23
確實(shí)有可能造成歧義。
這兩個基本規(guī)則是“或”的關(guān)系。但編譯器會需要更多的信息來確定到底調(diào)用哪個函數(shù),步驟為:
1. 先確定同名函數(shù)都有哪些,并且是在調(diào)用點(diǎn)“可見的”,這些函數(shù)就是“候選函數(shù)”。
2. 判斷每一個候選函數(shù)的參數(shù)是否滿足你的調(diào)用參數(shù)(不考慮返回值類型),這些選出的函數(shù)被稱為“可行函數(shù)”。這里面就包括參數(shù)數(shù)量不同但擁有默認(rèn)參數(shù)值的參數(shù)。 如果根本就選不出來,就直接報錯。
3. 如果可行函數(shù)不止一個,那么就看有沒有哪個函數(shù)的參數(shù)類型可以“完全”匹配調(diào)用參數(shù)類型,有的話就選它。 如果都需要進(jìn)行參數(shù)轉(zhuǎn)換,那么就有歧義,編譯器會報錯。
比如重載了函數(shù)fun:
當(dāng)你這樣調(diào)用:func(1.0); 就會調(diào)用第三個fun。 ?首先第二個fun會被排除掉,第一個和第三個fun會成為“可行函數(shù)”,但是第三個fun的第一個參數(shù)類型能完全匹配1.0,而第一個fun得需要進(jìn)行參數(shù)類型轉(zhuǎn)換。
但如果你這樣調(diào)用: fun(1); 會調(diào)用第一個fun,這時可行函數(shù)仍為#1和#3,但是第一個可以完全匹配參數(shù)類型。
可如果你這樣調(diào)用: fun(1, 1.0); 就會造成歧義,因為兩個可行函數(shù)(#2和#3)都有參數(shù)需要進(jìn)行類型轉(zhuǎn)換,編譯器不知道調(diào)用哪個“更好”。
2015-06-20
重載的條件就是函數(shù)名相同,參數(shù)列表不同。