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