在什么情况下把析构函数定义为私有的?-CSDN论坛-CSDN.NET-中国最大的IT技术社区 http://bbs.csdn.net/topics/80208934
只能用new生成的对象
用new生成的对象,在面向对象中是很有用的.它保存在堆上,可以自由控制生命周期。
但如何保证一个对象只能在堆上生成呢?
答案其实也很简单,只需把析构函数定义为私有成员。例如OnlyCanBeNew类定义。
1| class OnlyCanBeNew
2| {
3| ~OnlyCanBeNew(){}
4| public:
5| OnlyCanBeNew(){}
6| };
原因呢,C++是一个静态绑定的语言。在编译过程中,所有的非虚函数调用都必须分析完成。即使是虚函数,也需检查可访问性。因些,当在栈上生成对象时,对象会自动析构,也就说析构函数必须可以访问。而堆上生成对象,由于析构时机由程序员控制,所以不一定需要析构函数。
保证了不能在栈上生成对象后,需要证明能在堆上生成它。这里OnlyCanNew与一般对象唯一的区别在于它的析构函数为私有。delete操作会调用析构函数。所以不能编译。那么如何释放它呢?
答案也很简单,提供一个成员函数,完成delete操作。在成员函数中,析构函数是可以访问的。当然detele操作也是可以编译通过。
7| void OnlyCanBeNew::Destroy()
8| {
9| delete this;
10| }
还是不懂啊:
1.为什么要自己调用呢?对象结束生存期时不就自动调用析构函数了吗?什么情况下需要自己调用析构函数呢?
================================================================
比如这样一种情况,你希望在析构之前必须做一些事情,但是用你类的人并不知道,
那么你就可以重新写一个函数,里面把要做的事情全部做完了再调用析构函数。
这样人家只能调用你这个函数析构对象,从而保证了析构前一定会做你要求的动作。
2.什么情况下才用得着只生成堆对象呢?
================================
堆对象就是new出来的,相对于栈对象而言。什么情况下要new,什么情况下在栈里面
提前分配,无非就是何时该用动态,何时该用静态生成的问题。这个要根据具体情况
具体分析。比如你在一个函数里面事先知道某个对象最多只可能10个,那么你就可以
定义这个对象的一个数组。10个元素,每个元素都是一个栈对象。如果你无法确定数
字,那么你就可以定义一个这个对象的指针,需要创建的时候就new出来,并且用list
或者vector管理起来。
|
|
类中“私有”权限的含义就是:私有成员只能在类域内被访问,不能在类域外进行访问。
把析构函数定义为私有的,就阻止了用户在类域外对析构函数的使用。这表现在如下两个方面:
1. 禁止用户对此类型的变量进行定义,即禁止在栈内存空间内创建此类型的对象。要创建对象,只能用 new 在堆上进行。
2. 禁止用户在程序中使用 delete 删除此类型对象。对象的删除只能在类内实现,也就是说只有类的实现者才有可能实现对对象的 delete,用户不能随便删除对象。如果用户想删除对象的话,只能按照类的实现者提供的方法进行。
可见,这样做之后大大限制了用户对此类的使用。一般来说不要这样做;通常这样做是用来达到特殊的目的,比如在 singleton 的实现上。楼主可查找 singleton 的资料来了解它是怎么一回事。