如果设计了构造函数,也可以达到同样的目的,但是可以继承。
另外,如何保证堆上只能创建新的类对象? 只需将析构函数定义为私有成员即可。
原因是 C++ 是一种静态绑定语言。 在编译过程中,必须分析所有非虚函数的调用。 即使是虚函数也需要检查其可访问性。 因此,当在栈上生成一个对象时,该对象就会自动被析构,这意味着析构函数必须是可访问的。 当在堆上生成对象时,由于销毁的时机由程序员控制,因此不一定需要析构函数。 保证了栈上不能生成对象后,就要证明堆上可以生成。 与一般对象的唯一区别是它的析构函数是私有的。 该操作调用析构函数。 所以无法编译。
那么如何释放呢? 答案也很简单,提供一个成员函数来完成操作。 在成员函数中,可以访问析构函数。 当然,运行也可以编译通过。
void OnlyHeapClass::Destroy() {
delete this;
}
具有私有构造函数的类的设计可以保证只能使用new命令在堆中生成对象,并且只能动态创建对象,从而可以自由控制对象的生命周期。但是,这样的类需要提供创建和取消
公共接口。
另外,重载并使new成为私有可以达到要求在堆栈上创建对象的目的。 new 也可以用来在堆栈上创建它。
还是不明白:
1.为什么需要自己调用? 当对象生命周期结束时,析构函数不是会自动调用吗? 什么情况下需要自己调用析构函数?
=================================================== =============
例如,在一种情况下,你希望在析构之前必须完成一些事情,但使用你的类的人不知道,那么你可以重写一个函数,在调用析构函数之前完成所有要做的事情。 。 这样,人们只能调用你的函数来销毁对象,从而确保你需要的操作在销毁之前完成。
2、什么情况下需要只生成堆对象?
===============================
与栈对象相比,堆对象是通过new创建的。 什么时候用new,什么时候在栈上提前分配,无非就是什么时候用动态生成,什么时候用静态生成的问题。这个要看具体情况
具体分析。 例如,如果您事先知道函数中最多可以有 10 个对象,那么您可以定义该对象的数组。 10个元素,每个元素都是一个栈对象。 如果你不能确定数字,那么你可以定义一个指向这个对象的指针,需要创建时新建它,并使用列表或管理它。
类中“私有”权限的含义是私有成员只能在类域内访问,不能在类域外访问。
将析构函数定义为私有可以防止用户在类范围之外使用析构函数。 这表现在以下两个方面:
1、禁止用户定义该类型的变量,即禁止在栈内存空间创建该类型的对象。 创建对象只能在堆上使用new。
2. 禁止用户在程序中删除此类对象。 对象的删除只能在类内部实现,也就是说只有类的实现者才能实现对象的删除,用户不能随意删除对象。 如果用户想要删除该对象,只能根据该类的实现者提供的方法来进行。
可见,这样做极大地限制了用户对该类的使用。 一般来说,不要这样做; 通常这是为了特殊目的而完成的,例如在.
原文链接:C++私有构造函数的作用