C++类模板
#include <iostream>#include <string>
template <class T>
class Stack
{
public:
Stack(unsigned int size = 100)
{
this->size = size;
data = new T(size);
sp = 0;
}
~Stack()
{
delete []data; //动态删除数组
}
void push (T value)
{
data = value;
}
T pop()
{
return data[--sp];
}
private:
unsigned int size;
unsigned int sp;
T *data; //定义栈底指针
};
int main()
{
Stack<char> charStack(80);
charStack.push('a');
charStack.push('b');
charStack.push('c');
std::cout << charStack.pop() << '\n';
std::cout << charStack.pop() << '\n';
std::cout << charStack.pop() << '\n';
charStack.~Stack(); //小甲鱼视频里面没有这一行,所以不明白要不要加上这一句呢???
return 0;
}
本帖最后由 行客 于 2019-3-4 17:41 编辑
如果这样调用就是析构函数显式调用。显式调用并不推荐。
如果硬要显示调用析构函数,不是不可以,但是会有如下3条后果:
1)显式调用的时候,析构函数相当于的一个普通的成员函数;
2)编译器隐式调用析构函数,如分配了对内存,显式调用析构的话引起重复释放堆内存的异常;
3)把一个对象看作占用了部分栈内存,占用了部分堆内存(如果申请了的话),这样便于理解这个问题,系统隐式调用析构函数的时候,会加入释放栈内存的动作(而堆内存则由用户手工的释放);用户显式调用析构函数的时候,只是单纯执行析构函数内的语句,不会释放栈内存,也不会摧毁对象。 申请数组的时候你也写错了吧,应该是data = new T;吧 灰色的天空 发表于 2019-3-4 19:15
申请数组的时候你也写错了吧,应该是data = new T;吧
一样的,()编译运行也没问题
页:
[1]