设计一个类,只能在栈上创建对象

本文探讨了一种设计类的方法,确保该类的对象只能在栈上创建,而非堆上或全局区。通过私有化构造函数和operator new,并提供静态方法创建栈对象,实现了这一目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设计一个类,只能在栈上创建对象
//思考的几个要点:
//(1)只能在栈,说明不能在堆上创建,考虑堆上创建对象的两种方法-->new和定位new表达式,原理-->先调用operator new开空间,然后执行构造函数
//所以屏蔽掉operator new(即放成私有)这样就排斥了直接new和定位new表达式
//注意:上面的方法只能排斥掉在堆上创建,但是在全局区仍然可以
//(2)防止在全局区创建:构造函数设为私有(但这样一来在栈上直接创建也不行了)
//解决办法:提供一个接口,创建栈上的对象(存在问题:成员只能用对象调用,但是栈上的对象都创建不出)
//(解决办法->)将这个接口设为静态的,这样就不依赖于对象调用

//设计一个类:只能在栈上创建对象
//思考的几个要点:
//(1)只能在栈,说明不能在堆上创建,考虑堆上创建对象的两种方法-->new和定位new表达式,原理-->先调用operator new开空间,然后执行构造函数
//所以屏蔽掉operator new(即放成私有)这样就排斥了直接new和定位new表达式
//注意:上面的方法只能排斥掉在堆上创建,但是在全局区仍然可以
//(2)防止在全局区创建:构造函数设为私有(但这样一来在栈上直接创建也不行了)
//解决办法:提供一个接口,创建栈上的对象(存在问题:成员只能用对象调用,但是栈上的对象都创建不出)
//(解决办法->)将这个接口设为静态的,这样就不依赖于对象调用

class StackOnly
{
public:
	static StackOnly CreateStackobj()
	{
		return  StackOnly();
	}
private:
	StackOnly()
	{
	}

	void*operator new(size_t size);
	void operator delete(void*p);
};

//StackOnly p;
int main()
{
	//StackOnly*p = (StackOnly*)malloc(sizeof(StackOnly));
	//new(p)StackOnly;//定位new表达式
	//StackOnly*pt = new StackOnly;
	//StackOnly p;//在栈上创建
	StackOnly::CreateStackobj();//通过调用静态方法创建
	system("pause");
	return 0;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值