如何限制类的对象只能在堆上创建? 如何限制仅在堆栈上创建对象?
注意:在 C++ 中为类创建对象有两种类型:静态建立,动态建立
静态建立:编译器在堆栈空间上为对象分配内存,并直接调用类的构造函数来创建对象。 例如:a a;
动态建立:使用 new 关键字在堆空间上创建一个对象,底层首先调用算子 new() 函数在堆空间上找到合适的内存并分配; 然后,调用类的构造函数来创建对象。 例如:a *p = new a();
受限制的对象只能在堆上生成:
最直观的想法:避免直接调用类的构造函数,因为当对象是静态建立的时,会调用类的构造函数来创建对象。 但是,将类的构造函数设为私有是不可行的,因为当构造函数设置为私有时,不能在类外部调用构造函数来构造对象,只能新调用构造函数来构造对象。 但是,由于在创建对象时,类的构造函数也是在 new 的底部调用的,因此在将构造函数设置为 private 之后,无法使用 new 在类之外创建对象。 因此,这种方法是不可行的。 解决方法 1:
将析构函数设置为私有。原因:静态对象建立在堆栈上,编译器分配和释放内存空间,编译器为对象分配内存空间时,检查类的非静态函数,即编译器检查析构函数的可访问性。 当析构函数设置为 private 时,编译器创建的对象无法访问析构函数来释放对象的内存空间,因此编译器不会为堆栈上的对象分配内存。
class a void destory() private: ~a()该方法的问题:
使用 new 创建的对象通常使用 delete 来释放对象的内存空间,但析构函数不能从类外部调用,因此必须在类中定义一个 destory() 函数来释放由 new 创建的对象。 没有办法解决继承问题,因为如果将类用作基类,则将析构函数设置为虚拟,然后在派生类中重写函数以实现多态性。 但是在这一点上,析构函数是私有的,在派生类中不可访问。 解决方法 2:
将构造函数设置为 protected,并提供 public 的静态函数来完成构造,而不是在类外部使用新构造; 将析构函数设置为 protected。 原因:与单一实例模式类似,析构函数保证在派生类中可访问。 通过调用 create() 函数在堆上创建一个对象。
class a ~a() public: static a *create() void destory()受限制的对象只能在堆栈上构建:
解决办法:将运算符 new() 设置为 private。 原因:当一个对象在堆上构建时,它是以一种新的方式创建的,底层会调用运算符 new() 函数,所以只要函数受到限制,就可以阻止该对象在堆上构建。
类 a 注意函数的第一个参数和返回值是固定的: void operator delete(void *ptr) { 如果重载 new,则需要重载 delete public: a() a()。