之前說了一些函式模板的應用,這一篇部落格我們來說一下普通的函式和函式模板的區別,以及普通函式與函式模板的呼叫規則。閒話不說直接上乾貨。
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的乙個非常有力的擴充,即使我們不使用物件導向的機制,僅僅寫面向過程的程式,它也是很有用的。因為它可以很大程度上避免了因為引數和函式返回值的...