函數模板和類模板(+代碼實現)

一、函數模板

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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章