一、函數模板
1.函數模板
建立一個通用函數,其函數類型和形參類型不具體指定,用一個虛擬類型來代表這個通用函數來代表。凡是函數體相同的函數都可以用這個模板來代替,不必定義多個函數,只需在模板中定義一次即可。在調用函數時系統會根據實參的類型來取代模板中虛擬的類型,從而實現不同函數的功能。
作用:功能相同而數據類型不同的一些函數,不必一一定義各個函數,通過定義一個可以對任何類型變量操作的模板函數,在調用函數時,系統會根據實參的類型,取代函數模板中的類型參數,得到具體的函數。
2、函數模板的一般形式
template <typename T>
或
template <class T>
template 的含義是“模板”,尖括號中 typename(或class)是關鍵字,T是一個類型參數(虛擬的類型名)。 typename和class的作用相同,都是表示“類型名”,二者可以互換。
3、適用範圍
函數模板比函數重載更方便,程序更簡潔,但是它只適用於函數體相同、函數的參數個數相同而類型不同的情況。如果函數參數的個數不同,則不能用函數模板。
4、具體實現見下列代碼
二、類模板
1、類模板的一般形式
template <class 類型參數名>
template 是模板,template後面尖括號內的內容爲模板的參數表,class表示其後面的是類型參數,類型參數名可以任意取。
2、類模板實例化:
類名<實際類型名> 對象名[(參數表)];
或者
類名<實際類型名> *對象名 = new 類名<實際類型名>[(參數表)]
3、特點:由於模板包含類型參數,因此又稱爲參數化表,模板是類的抽象,類是模板的實例。利用模板可以建立包含各種數據類型的類。
4、類外定義類模板成員函數:
template <class 模板類型名>
返回類型 類名<模板類型名>::成員函數名(...)
{......}
5、具體實現見下列代碼。
#include <iostream>
#include <string>
using namespace std;
//類模板
template <class MyC>
class Compare
{
public:
MyC x, y;
Compare()
{
x = 0;
y = 0;
}
Compare(MyC a, MyC b)
{
x = a;
y = b;
}
MyC max()
{
return x > y ? x : y;
}
MyC min();
};
template <class MyC>
MyC Compare<MyC>::min()
{
return x < y ? x : y;
}
/* //函數模板
template <typename MyT>
MyT My_max(MyT a, MyT b)
{
return a > b ? a : b;
}
*/
int main()
{
/* //函數模板test
int i1 = 0, i2 = 1;
double d1 = 5.0, d2 = 3.0;
string s1 = "hello", s2 = "world";
cout << "int:" << My_max(i1, i2) << endl;
cout << "double:" << (%d)My_max(d1, d2) << endl;
cout << "string:" << My_max(s1, s2) << endl;
*/
//類模板test
Compare<int> m_Com1;
m_Com1.x = 1;
cout << "m_Com1:" << m_Com1.max() << endl;
Compare<int> *m_Com2 = new Compare<int>;
cout << "m_Com2:" << m_Com2->max() << endl;
Compare<int> m_Com3(3, 5);
cout << "m_Com3:" << m_Com3.max() << endl;
Compare<int> *m_Com4 = new Compare<int>(4, 2);
cout << "m_Com4:" << m_Com4->min() << endl;
return 0;
}