胡同学 发表于 2019-3-4 16:20:13

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:33:27

本帖最后由 行客 于 2019-3-4 17:41 编辑

如果这样调用就是析构函数显式调用。显式调用并不推荐。

如果硬要显示调用析构函数,不是不可以,但是会有如下3条后果:

1)显式调用的时候,析构函数相当于的一个普通的成员函数;

2)编译器隐式调用析构函数,如分配了对内存,显式调用析构的话引起重复释放堆内存的异常;

3)把一个对象看作占用了部分栈内存,占用了部分堆内存(如果申请了的话),这样便于理解这个问题,系统隐式调用析构函数的时候,会加入释放栈内存的动作(而堆内存则由用户手工的释放);用户显式调用析构函数的时候,只是单纯执行析构函数内的语句,不会释放栈内存,也不会摧毁对象。

灰色的天空 发表于 2019-3-4 19:15:16

申请数组的时候你也写错了吧,应该是data = new T;吧

胡同学 发表于 2019-3-7 19:41:09

灰色的天空 发表于 2019-3-4 19:15
申请数组的时候你也写错了吧,应该是data = new T;吧

一样的,()编译运行也没问题
页: [1]
查看完整版本: C++类模板