一、只能在堆上创建对象的类
要实现这样一个类,我们首先应该清楚:
- 类在创建对象时,一种是通过调用构造函数创建,另一种则是通过调用拷贝构造函数完成对象的创建。
- 基于上面的前提,要实现只在堆上创建对象,我们的方法是:
1.将类的构造函数私有,拷贝构造声明为私有,防止别人调用拷贝在栈上创建对象,
2.提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建。
class OnlyHeap
{
public:
static OnlyHeap* CreateObject()
{
return new OnlyHeap;
}
private:
// 构造函数私有
OnlyHeap()
{}
// C++98防拷贝方式
// 只声明,不实现。因为实现可能会很麻烦,而且本身也不需要
OnlyHeap(const OnlyHeap&);
// C++11防拷贝方式
OnlyHeap(const OnlyHeap&) = delete;
};
int main()
{
OnlyHeap* onlyheap = OnlyHeap::CreateObject();
return 0;
}
二、只能在栈上创建对象的类
要求只在栈上创建对象,即不能在堆上创建。
因此,我们可以有两种实现方法:
- 1.与上面类似,不过要注意,这一次我们只需要将构造函数私有即可,不需要将拷贝构造私有,因为调拷贝构造也只是拷贝构造在栈上创建的对象,不会用到堆空间。
class OnlyStack
{
public:
static OnlyStack CreateObject()
{
return OnlyStack();
}
private:
OnlyStack()
{}
};
- 2.要求我们只能在栈上创建对象,即不能在堆上创建。因此我们只需要将 new 的功能屏蔽掉,即屏蔽掉 operator new 和 定位new表达式。需要注意的是:在屏蔽掉 operator new 之后,实际上也将 定位new表达式 屏蔽掉了。
class OnlyStack
{
public:
OnlyStack()
{}
private:
void* operator new(size_t size);
void operator delete(void* p);
};