类模板就是Class的模板,和之前写过的函数模板大同小异。函数模板概念以及实现原理学习链接:点击打开链接
一、那么什么是类模板?有什么作用呢?
类模板也是对数据类型进行参数化处理,奖类模板实例化就是指定具体数据,将得到一个具体的、可定义对象的类。
一般写法比较单一,如果要处理多种数据类型就要定义多个类,会带来大量的代码冗余,造成不必要的工作量。普通类如下:
class Stack
{
public:
void push(int I);
int pop();
private:
enum {size = 100};
int m_array[size];
int m_count;
};
如果将Stack类改成模板类,则会省去很多麻烦,代码如下:
template<tepename T>
class Stack
{
public:
void push(T e);
T pop();
private:
enum { size = 100 };
int m_array[size];
int m_count;
};
//实例化模板
Stack<int> s1;
Stack<double> s2;
Stack<Shape> s1; //声明一个可以处理Shape对象的栈对象
简言之:1> 一个类模板可以处理不同类型的数据;
2> 提高程序员的开发效率,不再为不同类型写相同的代码。
定义模板类,模板参数包括类型参数T和非类型参数size,代码如下:
template<typename T,int size>
class Array
{
public:
T & operator[](int i) //模拟数组操作运算符‘[ ]’
{
return m_arr[i];
}
void set(int i, const T &e) //设置第 i 个元素值为 e
{
m_arr[i] = e;
}
T sun
{
for (int i = 0; i < size; i++)
{
sum += m_arr[i];
}
return sum;
}
private:
T m_arr[size]; //内置数组,用类型参数和非类型参数定义
};
二:类模板栗子讲解
template<class T,int size = 100>
class Stack
{
public:
Stack()
:m_iCount(0)
{ }
bool push(const T &e);
bool pop(T &e);
int get_size () const
{
return m_iCount;
}
private:
T m_iArray[size];
int m_iCount;
};
template<class T,int size>
bool Stack<T, size>::push(const T &e)
{
if (m_iCount < size)
{
m_iArray[m_iCount++] = e;
return true;
}
else
{
return false;
}
}
template<class T,int size>
bool Stack<T, size>::pop(T &e)
{
if (m_iCount >= 0)
{
e = m_iArray[--m_iCount];
return true;
}
else
{
return false;
}
}
int main()
{
cout << "=====类模板实例化=====" << endl;
Stack<int> iv;
iv.push(1); //压入1
iv.push(2); //压入2
iv.push(3); //压入3
iv.push(2); //压入2
cout << "元素个数" << endl;
cout << iv.get_size() << endl << endl;
int e = 0;
iv.pop(e);
cout << e << endl; //弹出元素
cout << "元素个数" << endl;
cout << iv.get_size ()<< endl << endl;
return 0;
}
输出: