方法一:
- 将类的构造函数私有,拷贝构造声明成私有。防止别人调用拷贝在栈上生成对象。
- 提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建。
//设计一个类,只能在栈上创建对象
class StackObj
{
public:
//公有的静态方法创建对象返回即可
static StackObj getObj()
{
return StackObj();
}
//构造函数私有
private:
StackObj()
{}
};
//全局的,在数据段
StackObj so = StackObj::getObj();
void test()
{
//new StackObj;
//拷贝一般在栈上
StackObj so = StackObj::getObj();
}
方法二: 屏蔽new
- 因为new在底层调用void* operator new(size_t size)函数,只需将该函数屏蔽掉即可。
注意:也要防止定位new。
//设计一个类,只能在栈上创建对象
class StackObj
{
public:
//禁止调用operator new
void* operator new(size_t n) = delete;
private:
//或者将operator new私有
//void* operator new(size_t n);
//void operator delete(void* p);
};
void test()
{
//
//StackObj* ptr = new StackObj;
StackObj so;
}