面试题:C++如何只在堆上或栈上生成对象

来源:互联网 发布:淘宝为什么没有比价了 编辑:程序博客网 时间:2024/06/02 00:16
栈一般是静态建立一个对象时,由编译器自动创建,而堆通常是调用new来动态开辟内存。

由此可知,如果不能调用new,那么也就无法在堆上生成对象了。我们将operator new和operator delete置为私有部分,类外就无法调用new在堆上生成对象了,也就只能在栈上生成对象。代码如下:

class B{public:    B()    {        cout << "B()" << endl;    }    ~B()    {        cout << "~C" << endl;    }private:    void* operator new(size_t);    void operator delete(void*);};void Test(){    //B* ptr = new B();    B b;}

那么如何只在堆上生成对象呢?
我们可以将析构函数置为protected,这样,类外使用静态方法创建对象的时候就会报错,同时要在类外自己提供释放对象的接口。代码如下:

class C{public:    static C* Creat()    {        return new C();//通过静态成员函数完成对象的构造    }    void Destroy()    {        delete this;    }protected://将默认构造函数与析构函数设为保护    C()    {        cout << "C()" << endl;    }    ~C()    {        cout << "~C()" << endl;    }};void Test(){    //C c;//不可访问    C *pc = C::Creat();    pc->Destroy();}
原创粉丝点击