1、類模板:將類定義中的數據類型參數化,比如:vector
2、類模板實際上是函數模板的推廣,可以用相同的類模板來組建任意類型的對象集合
(一)、類模板的定義
template <類型形參表>
class <類名>
{ //類說明體 };
template <類型形參表>
<返回類型> <類名> <類型名表>::<成員函數1>(形參表)
{ //成員函數定義體 }
template <類型形參表>
<返回類型> <類名> <類型名表>::<成員函數2>(形參表)
{ //成員函數定義體 }
…
template <類型形參表>
<返回類型> <類名> <類型名表>::<成員函數n>(形參表)
{ //成員函數定義體 }
(二)、使用類模板
類模板的實例化:用具體的數據類型替換模板的參數以得到具體的類(模板類)
模板類也可以實例化為對象
用下列方式創建類模板的實例:
類名 <類型實參表> 對象名稱;
對於函數模板與類模板,模板參數並不局限於類型(類類型,基本類型,模板類實例),普通值也可以作為模板參數
二、非類型模板參數template
對於函數模板與類模板,模板參數並不局限於類型,普通值也可以作為模板參數。
1、示例
Stack2.h:
#ifndef _STACK2_H_ #define _STACK2_H_ #includetemplate class Stack2 { public: Stack2(); ~Stack2(); void Push(const T &elem); void Pop(); T &Top(); const T &Top() const; bool Empty() const; private: T *elems_; int top_; }; template Stack2 ::Stack2() : top_(-1) { elems_ = new T[MAX_SIZE]; } template Stack2 ::~Stack2() { delete[] elems_; } template void Stack2 ::Push(const T &elem) { if (top_ + 1 >= MAX_SIZE) throw out_of_range("Stack2<>::Push() Stack2 full"); elems_[++top_] = elem; } template void Stack2 ::Pop() { if (top_ + 1 == 0) throw out_of_range("Stack2<>::Push() Stack2 empty"); --top_; } template T &Stack2 ::Top() { if (top_ + 1 == 0) throw out_of_range("Stack2<>::Push() Stack2 empty"); return elems_[top_]; } template const T &Stack2 ::Top() const { if (top_ + 1 == 0) throw out_of_range("Stack2<>::Push() Stack2 empty"); return elems_[top_]; } template bool Stack2 ::Empty() const { return top_ + 1 == 0; } #endif // _STACK2_H_
main.cpp:
#include "Stack2.h" #include#include using namespace std; int main(void) { Stack2 s; s.Push(1); s.Push(2); s.Push(3); while (!s.Empty()) { cout << s.Top() << endl; s.Pop(); } return 0; }
參考:
C++ primer 第四版
Effective C++ 3rd
C++編程規范