这是一个同学问我的问题.百度的时候知道答案是把析构函数弄成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
这件事情告诉我们,谁要是把析构函数私有化了,并且能编译通过了,那人不是什么高手,是因为它忘记释放堆中自己new的对象了!!!!!!