說起函式過載,我不由得想起了c++的「多型」特性。多型又分為靜態(編譯時)多型和動態(執行時)多型,靜態多型即為函式過載,動態多型則是虛函式機制。虛函式水較深,先不討論,今天我們來看一下函式過載、作用以及要避免的一些坑(尤其是二義性錯誤)。
一、先來review一下 函式過載的概念
1. 函式名相同;二、如何匹配要使用那個函式呢?在c++ primary 中文5版 p217我們可以發現端倪。2. 形參型別和數量不同;
3. 不關返回值的事。
1. 選定候選函式集 :① 與被呼叫函式同名; ② 宣告在呼叫點可見。=》沒有,返回無匹配錯誤三、函式過載二義性二義性是指在編譯過程中無法找出最匹配的函式,或者說編譯器在函式匹配過後還是有多個函式滿足要求,無法確定該執行那乙個引發的錯誤。2. 選定可行函式集:考察候選函式的引數列表,找出引數數量相同、且各個引數型別相同或者可以轉換為形參的函式;=》沒有,返回無匹配錯誤
3. 選出最佳匹配函式:層層選拔之後,如果倖存者函式有幾個的話(不太可能),我們就要找出最最最合適的那乙個,怎麼找?實參和形參型別最接近的那乙個。=》沒有,返回無匹配錯誤
具體表現:
1. 引數數目引發的歧義
12. 引數隱式轉換引發的歧義intget()4
intget(int a = 5)7
//呼叫get()
//不給引數和有預設引數會造成歧義。
1intget(intm)4
5long
get(long
m)//double d = 1.234;
//呼叫get(d);double既可以隱式轉換未long,也可以是int,或者說一般的數值型別之間都可以進行隱式型別轉換,故無法確定那乙個更加匹配。
13. 型別型相關歧義(較深內容,不容易理解)intget(inta)4
intget(int &a)7//
int m = 10;8//
呼叫get(m)
//傳值和傳引用都可以完成呼叫,只不過值傳遞有拷貝的開銷,而引用傳遞不會有。
p517-520,艱澀難懂,需要自己琢磨。
另外,我發現在p517的乙個例子,是錯誤的,並未發生歧義,不會導致執行錯誤。
1 #include 2 #include3using
namespace
std;45
structb;6
struct
a ;12
//...
13string name = "a"
;14};15
16struct
b ;22
//...
23string name = "b"
;24};25
26 a f(const a&)
2930
intmain()
31
(由g++執行)
C 函式過載二義性
說起函式過載,我不由得想起了c 的 多型 特性。多型又分為靜態 編譯時 多型和動態 執行時 多型,靜態多型即為函式過載,動態多型則是虛函式機制。虛函式水較深,先不討論,今天我們來看一下函式過載 作用以及要避免的一些坑 尤其是二義性錯誤 一 先來review一下 函式過載的概念 1.函式名相同 2.形...
函式的二義性
connect ui spinbox luminosity,qspinbox valuechanged,ui horizontalslider luminosity,qslider setvalue 執行上面語句,提示如下錯誤。connect 採用的是 qt 5 的語法,問題原因是函式 valuec...
C 二義性語法
以標準輸入裝置完成初始化操作 以下為錯誤寫法 std dequec std istream iterator std cin std istream iterator 以上c被解析為函式宣告。返回值為std deque,第乙個引數型別為std istream iterator,引數名為cin。第二個...