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

c 设计一个类:只能在堆上创建对象、只能在栈上创建对象、只能创建一个对象-ag真人游戏

在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(){};
};
网站地图