肥貓學習日記---------------------Linux下C++的類模板以及使用類模板創建順序棧

類模板

類模板的定義
	//創建模板的方法
	template <typename M,typename R,typename A,typename O>
	class Test//類名
	{
	public:
		//類型參數 val;
		M val;
		Test(A a)
		{
			o val;
		}
		R func(void)
		{
		}
	};
類模板的使用

類模板的參數不支持隱式推斷,必須顯示指定類型參數
類名<類型…>對象;

類模板分爲兩部進行實例化:
編譯期:編譯期將類模板實例化爲類,並生成類對象創建指令
運行期:處理器執行對象創建指令,將類實例化爲對象
類模板也是一種靜態多態,編譯期中就已經實現

類模板中,只有那些被調用的成員函數才實例化,即產生二進制指令(調用誰實例化誰)

類中靜態成員

需要在類外定義,這一點不改變,但與普通類的定義不同
template <typename …> 類型 類名 <…>::成員名

遞歸實例化

類模板的參數可以是任何類型,只要該類信號工提供類模板所需要的功能
類模板的實例化已經是一個有效的類型了,因此它也可以當做類模板的參數,這種叫作遞歸實例化
如:Vectors<Vectors < int > >

順序棧的模板類
#include <iostream>
#include <stack>

using namespace std;

template <typename T>
class Stack
{
	T* arr;
	int cnt;
	const int cal;
public:
	//構造函數
	Stack(int cal=1):cal(cal)
	{
		arr = new T[cal];
		cnt = -1;
	}
	//析構函數
	~Stack(void)
	{
		delete[] arr;
	}
	//判斷棧滿
	bool full(void)
	{
		return cnt >= cal;
	}
	//判斷棧空
	bool empty(void)
	{
		return cnt < 0;
	}
	//入棧
	bool push(T data)
	{
		if(full()) return false;
		arr[++cnt] = data; 
		return true;
	}
	//出棧
	void pop(void)
	{
		cnt--;
	}
	//棧頂元素
	T top(void)
	{
		return arr[cnt];
	}
	//棧的長度
	int size(void)
	{
		return cnt+1;
	}
};

int main()
{
	Stack<int> s(20);
	for(int i=0; i<10; i++)
	{
		s.push(i);
		cout << s.top() << endl;
	}
	while(!s.empty())
	{
		cout << s.top() << endl;
		s.pop();
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章