1. 程式人生 > >函式模板與類模板(模板類)

函式模板與類模板(模板類)

 

模板分為函式模板和類模板

函式模板是不區分型別的

函式模板是template<typename T1,typenameT2,.....typename Tn>

template<class T>
T1 Add( T &left,  T &right)
{
    return left + right;
}

typename是函式模板的關鍵字,也可以用class代替(但是一定不能用struct代替)

 

當然你可以不止定義一個引數,你可以定義多個引數:

//template<class T1,class T2>
//T1 Add( T1 left,  T2 right)
//{
//	return left + right;
//}
//int main()
//{
//	int a1 = 10, a2 = 20;
//	double b1 = 10.1, b2 = 9.9;
//	cout<<Add(a1, a2);
//	cout<<Add(b1, b2);
//	cout << Add(a1, (int)b1);
//	return 0;
//}

 

當然說到這裡就不得不說說關於函式模板的例項化:

函式模板的例項化分為顯式例項化和隱式例項化,就是讓不同型別的引數去轉化成同一型別去進行運算

上面那個程式碼“cout<<Add(a1,(int)b1)”,就是將b1的型別轉化為int進行運算,這就是隱式例項化

而顯式例項化就是下面這個程式碼

 

{
	int a = 10;
	double b = 2.3;
	cout<<Add<int>(a, b)<<endl;
	return 0;
}*

 

引數的匹配規則:

1.同名的非模板函式和一個函式模板,而且這個函式模板還可以被例項化為這個非模板函式;

2.如果引數不存在型別不匹配,優先選擇非模板函式,其次再看匹配進行選擇函式模板;

3.模板函式不允許自動型別轉化,但是一般函式可以。

那麼還是讓我們來看程式碼吧。

#include<iostream>
using namespace std;
//template<class T1,class T2>
//T1 Add( T1 left,  T2 right)
//{
//	return left + right;
//}
//int main()
//{
//	int a1 = 10, a2 = 20;
//	double b1 = 10.1, b2 = 9.9;
//	cout<<Add(a1, a2);
//	cout<<Add(b1, b2);
//	cout << Add(a1, (int)b1);
//	return 0;
//}隱式型別轉化
/*int main()
{
	int a = 10;
	double b = 2.3;
	cout<<Add<int>(a, b)<<endl;
	return 0;
}*///顯示型別轉化
//int Add(int left, int right)
//{
//	return left + right;
//}
//void test()
//{
//	cout<<Add(1, 2)<<endl;
//	cout<<Add(1, 5.0)<<endl;
//}
//int main()
//{
//	test();
//	return 0;
//}

你可以除錯去探究到底哪個引數呼叫nage函式。

類模板:類模板的格式template<class T1,class T2....classTn>

 

 

class 類模板名

 

 

{

     類成員

};

 

讓我們來看下程式碼,更好理解;

template<class T>
class Time
{
public:
	Time(T hour = 10, T minute = 20, T sec = 10)
		:_hour(hour)
		, _minute(minute)
		, _sec(sec)
	{}
	~Time()
	{
		cout << "~Time" << endl;
	};
	void diaplay();
private:
	T _hour;
	T _minute;
	T _sec;
};

template<class T>
void Time<T>::diaplay()
{
	cout << _hour << ":" << _minute << ":" << _sec << endl;
}
int main()
{
	Time <int>t1(20,10);
	t1.diaplay();
	return 0;
}

 注意:類模板函式放在類外定義時,一定要加模板引數列表。

類模板的例項化:類模板例項化需要在類模板名字後跟<>,然後將例項化的型別放在<> 中即可,類模板名字不是真正的類,而例項化的結果才是真正的類。

模板類是類模板例項化後的結果:舉個簡單例子 類模板相當於一個做餅乾的模板,你可以用這個模板做出餅乾,然而至於做出來是什麼味道,就要看你用什麼東西去例項化,你可以奶油,也可以用巧克力。這些東西不同雖然做出來都是餅乾但是味道不同。