如何限制类对象只能建立在堆上或者栈上?

整理至:链接

在C++中,类的对象建立分为两种,一种是静态建立,如A a;另一种是动态建立,如A ptr=new A;这两种方式是有区别的。

  • 栈上:编译器在栈上分配内存,然后调用构造函数初始化内存空间
  • 堆上:调用new分配合适的堆内存,然后调用构造函数初始化内存空间

1、只能建立在堆上

方法一:将构造函数设置为私有,这是不行的。因为operator new()函数只用于分配内存,无法提供构造功能,当构造函数设置为私有,就无法初始化内存。
方法二:将析构函数设置为私有(需要自定义一个内存释放函数),这是可以的。因为编译器在栈上创建对象时,会检查析构函数是否可以被调用,如果不可以被调用,那么就不可以调用创建栈上对象。

class A
{
public:
    A(){}
    void destory(){delete this;}
private:
    ~A(){}
};

如果A作为其它类的基类,则析构函数通常要设为virtual,然后在子类重写,以实现多态。因此析构函数不能设为private。所以析构函数一般设置为protected:

class A
{
public:
   A(){}
   void destory(){delete this;}
protected:
   ~A(){}
};

2. 只能在栈上分配类对象

禁用new就可以了。【注】重载了new就需要重载delete。

class A
{
private:
    void* operator new(size_t t){}     // 注意函数的第一个参数和返回值都是固定的
    void operator delete(void* ptr){} // 重载了new就需要重载delete
public:
    A(){}
    ~A(){}
};
posted @ 2023-10-18 14:33  好人~  阅读(67)  评论(0编辑  收藏  举报