栈一般是静态建立一个对象时,由编译器自动创建,而堆通常是调用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();
}