如何设计一个只能在堆上或只能在栈上创建对象的类

本文探讨了如何设计只能在堆上或栈上创建对象的类。对于只允许堆上创建的对象,可通过私有化构造函数和拷贝构造,然后提供静态成员函数来创建实例。而只允许栈上创建的对象,可以私有化构造函数,不允许 new 操作,以确保对象始终在栈上分配。
摘要由CSDN通过智能技术生成

一、只能在堆上创建对象的类

要实现这样一个类,我们首先应该清楚:

  • 类在创建对象时,一种是通过调用构造函数创建,另一种则是通过调用拷贝构造函数完成对象的创建。
  • 基于上面的前提,要实现只在堆上创建对象,我们的方法是:
    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);
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值