首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

怎么防止所写类的对象在栈中生成

2012-11-14 
如何防止所写类的对象在栈中生成?这是一个同学问我的问题.百度的时候知道答案是把析构函数弄成private就好

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

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

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

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

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

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

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

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

using namespacestd;


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;

    return0;

}

输出为

Constructor called!

12:12:12


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

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

热点排行