类模板
模板类实现顺序栈Stack
类模板 => 实例化 => 模板类
#include <iostream>
using namespace std;
//类模板
template<typename T>
class SeqStack //模板名称+类型参数列表 = 类名称
{
public:
//构造和析构函数名不用加<T>,其它出现模板的地方都加上类型参数列表
SeqStack(int size = 10)
: _pstack(new T[size])
, _top(0)
, _size(size)
{}
~SeqStack()
{
delete[]_pstack;
_pstack = nullptr;
}
//重写 拷贝构造
SeqStack(const SeqStack<T>& stack)
:_top(stack._top)
, _size(stack._size)
{
_pstack = new T[_size];
//不要用memcopy进行拷贝
for (int i = 0; i < _top; ++i)
{
_pstack[i] = stack._pstack[i];
}
}
//重写 赋值重载
SeqStack<T>& operator=(const SeqStack<T>& stack)
{
//防止自赋值
if (this == &stack)
return *this;
delete[]_pstack;
_top = stack._top;
_size = stack._size;
_pstack = new T[_size];
//不要用memcopy进行拷贝,如果类型是个对象,会出现浅拷贝
for (int i = 0; i < _top; ++i)
{
_pstack[i] = stack._pstack[i];
}
return *this;
}
void push(const T& val);//入栈操作,在类外实现
void pop()//出栈操作
{
if (empty())
return;
--_top;
}
T top()const//返回栈顶元素
{
if (empty())
throw "stack is empty!";//抛异常也代表函数逻辑结束
return _pstack[_top - 1];
}
bool full()const { return _top == _size; }//栈满
bool empty()const { return _top == 0; }//栈空
private:
T* _pstack;
int _top;
int _size;
//顺序栈底层数组按2倍的方式扩容
void expand()
{
T* ptmp = new T[_size * 2];
for (int i = 0; i < _top; ++i)
{
ptmp[i] = _pstack[i];
}
delete[]_pstack;
_pstack = ptmp;
_size *= 2;
}
};
template<typename T>//类外实现,还要再写这个哦,因为这个类模板作用域到{开始 }结束了
void SeqStack<T>::push(const T& val)//入栈操作
{
if (full())
expand();
_pstack[_top++] = val;
}
int main()
{
//类模板的选择性实例化
//
//实例化后 产生模板类 class SeqStack<int>{};
SeqStack<int> s1;//编译器到达这个调用点,会把模板实例化一份专门处理int的类出来
//到这个点生成的模板类只有构造函数和析构函数,其他的方法等被对象调用了才被实例化出来
//减少编译器的工作
s1.push(20);
s1.push(78);
s1.push(32);
s1.push(15);
s1.pop();
cout << s1.top() << endl;
//SeqStack<> s2; //template<typename T = int>
return 0;
}
类模板还可以加默认的类型参数:
就可以这样去使用它