标题是曾经看到过的一个小问题,当时想法简单也没有实际操作,最近在网上搜了一搜关于这个问题的一些博客,自己总结一下问题的实际操作以及操作产生的问题(堆栈就不详述了,标题可以理解:“如何限制一个类对象只可以new(直接声明)?”)。
1、如何限制一个类对象只在堆上分配空间?
限制一个类对象只在堆上分配空间,即这个对象只可以new出来,却不可以直接声明出来。我们都知道在new的时候其实执行是分两个步骤,首先是调用operator new()函数,在堆中申请类大小的内存,其次就是调用类的构造函数。如果我们简单粗暴地将构造函数设置为私有成员,我们在无法直接声明对象的同时也无法通过new来创建对象,故这种方法不可以。
当对象建立在栈上面,是由编译器分配内存空间,调用类的构造函数的,当对象“生命”结束的时候,也是由编译器来进行资源回收,调用类的析构函数。也就是说这个对象的整个生命周期都是编译器掌握的。那么如果编译器无法调用析构函数会发生什么情况呢?我们创建一个类,并将类析构函数权限设置为私有,在程序中直接声明一个对象看看结果如何。
class A
{
private:
~A(){}
};
int main()
{
A a;//无法通过编译
return 0