1、类模板:将类定义中的数据类型参数化,比如:vector<int>, vector<string>
2、类模板实际上是函数模板的推广,可以用相同的类模板来组建任意类型的对象集合
(一)、类模板的定义
template <类型形参表>
class <类名>
{ //类说明体 };
template <类型形参表>
<返回类型> <类名> <类型名表>::<成员函数1>(形参表)
{ //成员函数定义体 }
template <类型形参表>
<返回类型> <类名> <类型名表>::<成员函数2>(形参表)
{ //成员函数定义体 }
…
template <类型形参表>
<返回类型> <类名> <类型名表>::<成员函数n>(形参表)
{ //成员函数定义体 }
(二)、使用类模板
类模板的实例化:用具体的数据类型替换模板的参数以得到具体的类(模板类)
模板类也可以实例化为对象
用下列方式创建类模板的实例:
类名 <类型实参表> 对象名称;
对于函数模板与类模板,模板参数并不局限于类型(类类型,基本类型,模板类实例),普通值也可以作为模板参数
对于函数模板与类模板,模板参数并不局限于类型,普通值也可以作为模板参数。
1、示例
Stack2.h:
#ifndef _STACK2_H_ #define _STACK2_H_ #include <exception> template <typename T, int MAX_SIZE> 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 <typename T, int MAX_SIZE> Stack2<T, MAX_SIZE>::Stack2() : top_(-1) { elems_ = new T[MAX_SIZE]; } template <typename T, int MAX_SIZE> Stack2<T, MAX_SIZE>::~Stack2() { delete[] elems_; } template <typename T, int MAX_SIZE> void Stack2<T, MAX_SIZE>::Push(const T &elem) { if (top_ + 1 >= MAX_SIZE) throw out_of_range("Stack2<>::Push() Stack2 full"); elems_[++top_] = elem; } template <typename T, int MAX_SIZE> void Stack2<T, MAX_SIZE>::Pop() { if (top_ + 1 == 0) throw out_of_range("Stack2<>::Push() Stack2 empty"); --top_; } template <typename T, int MAX_SIZE> T &Stack2<T, MAX_SIZE>::Top() { if (top_ + 1 == 0) throw out_of_range("Stack2<>::Push() Stack2 empty"); return elems_[top_]; } template <typename T, int MAX_SIZE> const T &Stack2<T, MAX_SIZE>::Top() const { if (top_ + 1 == 0) throw out_of_range("Stack2<>::Push() Stack2 empty"); return elems_[top_]; } template <typename T, int MAX_SIZE> bool Stack2<T, MAX_SIZE>::Empty() const { return top_ + 1 == 0; } #endif // _STACK2_H_
main.cpp:
#include "Stack2.h" #include <iostream> #include<string> using namespace std; int main(void) { Stack2<int, 5> 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++编程规范