鱼C论坛

 找回密码
 立即注册
查看: 2715|回复: 3

C++类模板

[复制链接]
发表于 2019-3-4 16:20:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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[sp++] = 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-3-4 17:33:27 | 显示全部楼层
本帖最后由 行客 于 2019-3-4 17:41 编辑

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

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

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

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

3)把一个对象看作占用了部分栈内存,占用了部分堆内存(如果申请了的话),这样便于理解这个问题,系统隐式调用析构函数的时候,会加入释放栈内存的动作(而堆内存则由用户手工的释放);用户显式调用析构函数的时候,只是单纯执行析构函数内的语句,不会释放栈内存,也不会摧毁对象。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-4 19:15:16 | 显示全部楼层
申请数组的时候你也写错了吧,应该是data = new T[size];吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-7 19:41:09 | 显示全部楼层
灰色的天空 发表于 2019-3-4 19:15
申请数组的时候你也写错了吧,应该是data = new T;吧

一样的,()编译运行也没问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-3 10:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表