C 函式過載二義性

2022-02-09 21:52:56 字數 1777 閱讀 8393

說起函式過載,我不由得想起了c++的「多型」特性。多型又分為靜態(編譯時)多型和動態(執行時)多型,靜態多型即為函式過載,動態多型則是虛函式機制。虛函式水較深,先不討論,今天我們來看一下函式過載、作用以及要避免的一些坑(尤其是二義性錯誤)。

一、先來review一下 函式過載的概念

1. 函式名相同;

2. 形參型別和數量不同;

3. 不關返回值的事。

二、如何匹配要使用那個函式呢?在c++ primary 中文5版 p217我們可以發現端倪。

1. 選定候選函式集 :① 與被呼叫函式同名; ② 宣告在呼叫點可見。=》沒有,返回無匹配錯誤

2. 選定可行函式集:考察候選函式的引數列表,找出引數數量相同、且各個引數型別相同或者可以轉換為形參的函式;=》沒有,返回無匹配錯誤

3. 選出最佳匹配函式:層層選拔之後,如果倖存者函式有幾個的話(不太可能),我們就要找出最最最合適的那乙個,怎麼找?實參和形參型別最接近的那乙個。=》沒有,返回無匹配錯誤

三、函式過載二義性二義性是指在編譯過程中無法找出最匹配的函式,或者說編譯器在函式匹配過後還是有多個函式滿足要求,無法確定該執行那乙個引發的錯誤。

具體表現:

1. 引數數目引發的歧義

1

intget()4

intget(int a = 5)7

//呼叫get()

//不給引數和有預設引數會造成歧義。

2. 引數隱式轉換引發的歧義

1

intget(intm)4

5long

get(long

m)//double d = 1.234;

//呼叫get(d);double既可以隱式轉換未long,也可以是int,或者說一般的數值型別之間都可以進行隱式型別轉換,故無法確定那乙個更加匹配。

1

intget(inta)4

intget(int &a)7//

int m = 10;8//

呼叫get(m)

//傳值和傳引用都可以完成呼叫,只不過值傳遞有拷貝的開銷,而引用傳遞不會有。

3. 型別型相關歧義(較深內容,不容易理解)

p517-520,艱澀難懂,需要自己琢磨。

另外,我發現在p517的乙個例子,是錯誤的,並未發生歧義,不會導致執行錯誤。

1 #include 2 #include 

3using

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++執行)

四、如何避免/解決

一是我們要注意預設引數,二是要考慮型別轉換,使用explicit可以阻止隱式型別轉換。

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。第二個...