1. 程式人生 > >C++ Template模板函式與模板類

C++ Template模板函式與模板類

函式模板擴充套件了函式過載並簡化函式的過載:
利用函式過載可以讓多個函式共享一個函式名,只要所過載的函式的引數型別必須有所不同。
但是,由於引數的型別不一樣,雖然這些函式所完成的功能完全一樣,也必須為每一個過載函式編寫程式碼。


類模板實際上是函式模板的推廣,
它是一種不確定類的某些資料成員的型別或成員函式的引數及返回值的型別的類。
(類是對問題的抽象,而類模板是對類的抽象,即更高層次上的抽象)
類模板稱為帶引數(或引數化)的類,也稱為類工廠,它可用來生成多個功能相同而某些資料成員的型別不同或成員函式的引數及返回值的型別不同的類。

****************************************************************************************************************************************

 一:模板函式

//template <class  識別符號>
//函式宣告

  1> 示例:

#include <bits/stdc++.h>
using namespace std;


template<class T1,class T2>
T1 Max(T1 x1, T2 x2)
{
	return x1 > x2 ? x1 : (T1)x2;
}

template<class T>
T abs(T x)    //控制形參型別與返回值型別一致,返回值的型別由引數值的型別決定
{
	return x<0 ? -x : x;
}
void main_0()
{
	int n = -5;
	double d = -5.5;
	cout << abs(n) << endl;
	cout << abs(d) << endl;
	int a = 10;
	double b = 20;
	cout << Max(a, b) << endl;
}

  2> 注意事項:

 

 

 

二: 模板類

☆這裡需要明確三步:類的宣告,類成員函式/資料成員的初始化、類的例項化

 1> 原始碼(解釋版):

#include <iostream>
using namespace std;

//template < class T,class B >  //這裡定義幾個,在例項化的時候就要在類的後面例項化幾個型別,儘管沒有全部使用
template <class T>
class  MyTemClass
{
private:
	T x;
	// 型別引數T用於宣告資料成員
public:
	void SetX(T   a);
	// 型別引數T用於宣告成員函式的引數
	T GetX() { return    x; };
	// 型別引數T用於宣告成員函式的返回值
};

template < class  T >     // 不能省略模板宣告
void MyTemClass < T > ::SetX(T a)
{
	x = a;
}

int main()
{
	MyTemClass<int> A;
	A.SetX(5);
	cout << A.GetX() << endl;
	return 0;
}

 2> 原始碼(應用版):構造陣列模板類並實現排序

#include <iostream>
#include <algorithm>
using namespace std;

template <class T1>
class TemplateArray
{
private:
	T1 *p;
	int length;
public:
	~TemplateArray()
	{
		delete[]p;
	}
	TemplateArray(int n)
	{
		length = n;
		p = new T1[n];
	}
	void Init_Array()
	{
		T1 temp_number = 10;
		for (T1 i = 0; i < length; i++)
		{
			*(p + i) = temp_number;
			temp_number--;
		}
	}
	void sort_array_STL()    //使用algorithm庫中的模板直接排序
	{
		sort(p, p + length);
	}
	void sort_array()    //使用冒泡老老實實地排序
	{
		T1 temp_data = 0;
		bool ischanged = false;
		for (T1 i = length-1; i > 0; i--)
		{
			for (T1 j = 0; j < i; j++)
			{
				if (*(p + j) > *(p + j + 1))
				{
					temp_data = *(p + j);
					*(p + j) = *(p + j + 1);
					*(p + j + 1) = temp_data;
					ischanged = true;
				}
			}
			if (!ischanged)
			{
				return;
			}
		}
	}
	void Show_Array()
	{
		for (T1 i = 0; i < length; i++)
		{
			cout << *(p + i) << endl;
		}
	}
};

int main()
{
	TemplateArray<int> A(10);    //陣列型別為int,長度為10
	A.Init_Array();
	//A.sort_array_STL();
	A.sort_array();
	A.Show_Array();
	return 0;
}