如何防止所写类的对象在栈中生成?

         这是一个同学问我的问题.百度的时候知道答案是把析构函数弄成private就好了.编译器就不允许用在栈中定义的对象的方式进行定义了.

         学析构函数的时候才彻底弄懂.先来看下析构函数的调用时间:

         1.局部对象在函数返回时的调用析构函数;

         2.static或定义的全局对象在main()或程序exit()后调用析构函数;

         3.使用delete运算符的时候,调用析构函数.

1和2的方法都是编译器自行调用析构函数的,聪明的编译器会在编译前查看是否有可用的析构函数,所以编译器在你用前两种方式,包括 static Class classneme(...)进行定义都会提示Class has a private destructor,不给你编译通过了.

但是3的方法有个不同之处就是,堆中的对象的管理是程序员自己去管理的,所以编译器不管了.所以我下面的代码是通过的,虽然析构函数是private的,编译器在delete时才会发现:妹的,尼玛程序员把析构函数给类私有化了!

using namespace std;


class Time{

public:

    void get_time(int a);

    Time()

    {cout<<"Constructor called!"<<endl;};

    

    Time(int h=0,int m=0,int s=0):hour(h),minute(m),sec(s)//参数列表的写法,注意以类中的声明顺序为顺序.

    {cout<<"Constructor called!"<<endl;}

    

private:

    int hour;

    int minute;

    int sec;   

    ~Time();

};



#include <iostream>

#include "Time.h"


int main(int argc,constchar * argv[])

{

    //static Time time1(12,12,12);

    Time * time1 = new Time(12,12,12); 

    time1->get_time(12);

    

    //声明一个类函数成员的指针

    void (Time::* p)(int)=&Time::get_time;

    //delete time1;

    return 0;

}

输出为

Constructor called!

12:12:12


去掉delete time1的注释就会报错了.

这件事情告诉我们,谁要是把析构函数私有化了,并且能编译通过了,那人不是什么高手,是因为它忘记释放堆中自己new的对象了!!!!!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值