過載函式匹配步驟:
(1)候選函式的確定:與被調函式同名的函式
(2)選擇可行函式:在候選函式中,選擇可以呼叫的函式:1)引數個數與被調函式引數個數相等;2)實參型別與形參型別匹配或者可以隱式型別轉換;
(3)選擇最佳匹配:
① 其每個實參匹配都不劣於其他可行函式需要的匹配
② 至少有乙個實參的匹配優於其他可行函式的匹配。
(4)如果沒有存在多個最佳匹配,匹配就有二義性;
實參匹配與轉換:
(1)實參型別轉換的優先降序等級:精確匹配》 整型提公升》 標準轉換》 類型別轉換;
(2)沒有乙個標準轉換會比另乙個標準轉換匹配更好,char到unsigned char 與char 到double的匹配是一樣的;
(3)列舉物件只能用同乙個列舉型別或者另外乙個列舉物件進行初始化,但列舉物件可以提公升為整型傳遞給函式(至少提公升為int型或更大);
(4)當兩個類定義了相互轉換的時候,a類既可以通過b類的建構函式轉換為b類,也可以通過a類的型別轉換操作符轉換為b類,這種情況下存在歧義,除非顯式呼叫建構函式或者轉換操作符函式,使用強制型別轉換解決不了歧義,所以盡量避免編寫存在隱式轉換成對的類;
(5)如果過載集中有兩個函式用同一類型別轉換函式匹配,則使用轉換之後或者轉換之前的標準轉換序列等級來確定最佳匹配。
(6)如果過載集中有兩個函式可以使用不同的類型別轉換函式匹配,則認為這兩個轉換操作一樣的好,不管是否需要標準轉換。
(7)引數同乙個匹配過程中,不能存在多個類型別轉換函式匹配,否則會出錯;
(8)當同時存在函式模版和普通函式的過載版本時候,他們都可以進行匹配,則普通函式優先。
四、設計時需要注意的地方:
(1)盡量不要定義相互轉換的類,容易產生二義性;
(2)盡量避免到內建算術型別的轉換,因為這樣很容易與操作符的過載函式產生歧義;
(3)如果定義了到內建型別的轉換函式,那麼盡量不要定義接受內建型別操作符的過載版本;
(4)如果定義了到內建型別的轉換函式,那麼不要定義多個內建型別的轉換函式,盡量讓標準型別轉換提供到其他內建型別的轉換;
過載函式引數的轉換和匹配
為了確定最佳匹配,編譯器將實參型別到相應形參型別轉換劃分等級。轉換等級以降序排列如下 1 精確匹配。實參與形參型別相同。2 通過型別提公升實現的匹配 第 5.12.2 節 3 通過標準轉換實現的匹配 第 5.12.3 節 4 通過類型別轉換實現的匹配 第 14.9 節將介紹這類轉換 型別提公升或轉換...
C 過載函式(函式匹配與實參型別轉換)
1,函式匹配 過載確定 過載確定的三個步驟 1 候選函式 2 選擇可行函式 3 尋找最佳匹配 比較特殊的是print 3.14 它的引數是double型別,但是選擇候選函式的時候,因為沒有最完美匹配,只能丟失精度,強制轉換為int型別。還有print 3.2,1 這種型別,因為目標函式不唯一,有二義...
錯誤 沒有與引數列表匹配的 過載函式
cstring str str.format d count 這句話報錯 m static.setwindowtextw str 錯誤是 2 intellisense 沒有與引數列表匹配的 過載函式 atl cstringt format 其中 basetype wchar t,stringtrai...