菜鸟笔记
提升您的技术认知

C++设计一个类:只能在堆上创建对象、只能在栈上创建对象、只能创建一个对象

在C++中,创建类的对象有两种方法,一种是静态建立,A a; 另一种是动态建立,调用new 操作符。

一、只能在堆上创建对象

  • 就是动态建立类的对象,使用new操作符来完成。
  • 做法一:将该类的构造函数析构函数权限设为protected,(可以让该类可以被继承),然后定义两个static 函数来调用new ,delete 来创建和销毁对象。
class A
{
  
protected:
    A()
    {};
    ~A()
    {};

    static A* Create()
    {
        return new A();
    }

    static void Destory(A* p)
    {
        delete p;
        p = NULL;
    }
};
  • 做法二:
    对象建立在栈上面时,是由编译器分配空间的,调用构造函数来构造栈对象,当对象使用完之后,编译器会调用析构函数来释放栈对象所占的空间,编译器管理了对象的整个生命周期,编译器为对象分配空间的时候,只要是非静态的函数都会检查,包括析构函数,但是此时析构函数不可访问,编译器无法调用类的析构函数来释放内存,那么编译器将无法在栈上为对象分配内存。
class A
{
public:
    A()
    {
        cout << "A()" << endl;
    }

private:
    ~A()
    {
        cout << "~A()" << endl;
    }
};

int main()
{
    //A a;//栈上创建
    A* p = new A;//堆上创建
    return 0;
}

二、只能在栈上创建对象

  • 只能在栈上创建的对象的话,就是不能调用new 操作符,所以可以将operator new 和operator delete 设置为私有的。
class AA
{
private:
    void* operator new(size_t)
    {};
    void operator delete(void*)
    {};
public:
    AA()
    {
        cout << "AA()" << endl;
    }
    ~AA()
    {
        cout << "~AA()" << endl;
    }
};

三、只能创建一个对象

  • 在类中创建一个静态变量Count,用来限制可创建的实例的数量。
class singleclass
{
  
public:
    static singleclass* getsingleclass()
    {
        if (count > 0)
        {
            count--;
            return new singleclass();
        }
        else
        {
            return NULL;
        }
    }
private:
    static int count;
    singleclass(){};
};