1. 如何创建一个只能在栈上创建对象的类:
思路:那就是不能使用new生成对象了,然后我们把new运算符重载和delete运算符重载不给外部暴露即可。
code:
class AA
{
private:
void* operator new(size_t){}
void operator delete(void*){} //重载了new就需要重载delete
public:
AA()
{
cout << "AA()" << endl;
}
~AA()
{
cout << "~AA()" << endl;
}
};
2. 如何生成一个只能在堆上产生对象的类呢:
一个构造在栈上的对象,其占用空间是由编译器在编译时分配,空间的释放也是由编译器完成。
所以,不允许一个类构造在栈上,即不允许编译器访问、调用类的析构函数,同时得保证构造在堆上的对象可以被正常释放。
因为编译器会去检查每个方法能不能用,如果不能使用,那么自然就报错了。
code:
class AA{
public:
AA(){
cout << "AA()" << endl;
}
void destroy(){
delete this;
}
private:
~AA(){
cout << "~AA()" << endl;
}
};
int main()
{
//AA q; //在栈上创建对象
AA* p = new AA; //在堆上创建对象
return 0;
}
上述代码有个问题:
我们将析构函数定义为私有的,那么如果我们需要继承来实现多态,常常需要将析构函数定义为虚函数,那么如果是私有的话,子类将无法访问该方法,那么就将析构函数设置为protected的
class A
{
protected :
A(){}
~A(){}
public :
static A* create()
{
return new A();
}
void destory()
{
delete this ;
}
};