類模板
類模板的定義
//創建模板的方法
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();
}
}