C 提高3 普通函式與函式模板

2021-10-03 13:54:19 字數 3616 閱讀 6995

之前說了一些函式模板的應用,這一篇部落格我們來說一下普通的函式和函式模板的區別,以及普通函式與函式模板的呼叫規則。閒話不說直接上乾貨。

1.1 普通函式呼叫時可以發生自動型別轉換(隱式型別轉換)

首先看第一條,普通函式呼叫時可以發生自動型別轉換(隱式型別轉換)

我們先舉乙個例子。

#include

#include

using

namespace std;

intmyadd

(int a ,

int b)

void

test01()

intmain()

最後的結果是這樣的:

30

109請按任意鍵繼續.

..

第乙個30沒有異議,但是第二個結果的109是怎麼回事呢,是因為在計算過程中,編譯器將字元型運算轉換為了整型運算。我們知道,c的acsii是99,所以最後的結果是109。

這就是所謂的普通函式呼叫時可以發生隱式型別轉換

1.2 函式模板呼叫時,如果利用自動型別推導,不會發生隱式型別轉換

我們接下來繼續貼一段**:

#include

#include

using

namespace std;

template

<

typename t>

t myadd

(t a ,t b)

void

test()

intmain()

我們可以發現,在利用自動型別推導時,模板是沒有辦法統一int型別和char型別的,所以cout << myadd(a, c) << endl;這一句**就報錯了。

1.3 如果利用顯示指定型別的方式,可以發生隱式型別轉換

如果想用函式模板計算不同的型別,該怎麼做呢?我們可以利用顯示指定型別的方式來發生隱式型別轉換

直接上**:

#include

#include

using

namespace std;

template

<

typename t>

t myadd

(t a ,t b)

void

test()

intmain()

發現這樣就可以運算了,最後的結果為:

30

109請按任意鍵繼續.

..

總結一下:

建議使用顯示指定型別的方式,呼叫函式模板,因為可以自己確定通用型別t

呼叫規則如下:

2.1 如果函式模板和普通函式都可以實現,優先呼叫普通函式

直接上**解釋一下

#include

#include

using

namespace std;

template

<

typename t>

//1、先寫乙個普通函式

void

myprint

(int a ,

int b)

//2.再寫乙個模板函式

template

<

typename t>

void

myprint

(t a,t b)

void

test01()

intmain()

這個時候問題來了,我們究竟是呼叫普通函式還是函式模板呢?我們來執行一下。

呼叫的普通函式

請按任意鍵繼續.

..

我們發現,當函式模板和普通函式都可以呼叫的時候,是優先呼叫普通函式的。

(憨憨的編譯器)

2.2 可以通過空模板引數列表來強制呼叫函式模板

首先我們先要說明,什麼叫做空模板。就是在函式的呼叫前面加上尖括號

myprint<

>

(a, b)

;

我們來貼一下程式。

#include

#include

using

namespace std;

//1、先寫乙個普通函式

void

myprint

(int a,

int b)

template

<

typename t>

void

myprint

(t a, t b)

void

test01()

intmain()

執行一下看看結果:

呼叫的模板

請按任意鍵繼續.

..

成功的呼叫了函式模板。由此可見我們可以通過空模板引數列表來強制呼叫函式模板。

2.3 函式模板也可以發生過載

這個就沒什麼好說的了,直接上**

#include

#include

using

namespace std;

template

<

typename t>

void

myprint

(t a, t b)

//新增了乙個引數,此時已經構成了乙個函式模板的過載。

template

<

typename t>

void

myprint

(t a, t b,t c)

void

test01()

intmain()

最後執行一下結果:

呼叫的模板過載

請按任意鍵繼續.

..

乙個是兩個引數,乙個是三個引數,我們可以看到,發生了函式的過載。

2.4 如果函式模板可以產生更好的匹配,優先呼叫函式模板

這個直接上**我們看一眼:

#include

#include

using

namespace std;

void

myprint

(int a,

int b)

template

<

typename t>

void

myprint

(t a, t b)

void

test01()

intmain()

{test01()

;system

("pause"

);

如果是走普通函式的話,還要進行強制轉換,但是有了模板,顯然對於char的型別,還是模板更有用,所以編譯器自動匹配了模板。

看下執行結果:

呼叫的模板

請按任意鍵繼續.

..

總結一下:

既然提供了函式模板,最好就不要提供普通函式,否則容易出現二義性

C 函式模板與普通函式

當我們要對不同的資料型別進行同樣的操作的時候,我們可能要分別編寫幾個函式去對應資料型別進行相似的操作,比如說交換兩個資料 我們使用函式模板就會大大提高效率 示例 include using namespace std template typename t 宣告乙個模板,t是乙個通用資料型別 或te...

普通函式與函式模板的區別

普通函式與函式模板的區別 普通函式呼叫時可以發生自動型別轉換 型別轉換 函式模板呼叫時,如果利用自動型別推導,不會發生隱式型別轉換 如果利用顯示指定型別的方式們可以發生隱式型別轉換 include using namespace std 普通函式與函式模板區別 1.普通函式呼叫可以發生隱式型別轉換 ...

c 函式模板 3

模板從大體上,可以分為兩種 函式模板和類模板。函式模板是演算法庫的基礎,類模板是建立標準庫容器和迭代器的基礎。這一小節我們只介紹函式模板。個人覺得,模板是c 對c的乙個非常有力的擴充,即使我們不使用物件導向的機制,僅僅寫面向過程的程式,它也是很有用的。因為它可以很大程度上避免了因為引數和函式返回值的...