爱玩科技网
您的当前位置:首页设计一个类,只能在栈上创建对象

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

来源:爱玩科技网

设计一个类,只能在栈上创建对象
//思考的几个要点:
//(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;
}

 

因篇幅问题不能全部显示,请点此查看更多更全内容