读书人

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

发布时间: 2012-11-14 10:12:18 作者: rapoo

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

这是一个同学问我的问题.百度的时候知道答案是把析构函数弄成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的对象了!!!!!!

读书人网 >编程

热点推荐