前两天去面试 碰到一个 题目 构造函数私有化了。。问有什么问题。。我居然没发现!疯了
今天在公司突然想起 析构函数 在什么情况下私有化的问题 (虽然以前知道 但总也记不住 )一位筒子的回复 挺好的 转到这里:
只能用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| }