C++如何只能在堆上或栈上生成对象

#include <iostream>
using namespace std;

//只能在栈上构造对象的实现:即不能调用new来在堆上构造对象,调用new其会调用operator new(),
//所以只要显示定义重载一下operator new() operator delete()操作符设为私有部分
//类外就无法调用new/delete在堆上建立释放对象了。
class B
{
public:
	B()
	{
		cout<<"B()"<<endl;
	}
	~B()
	{
		cout<<"~B()"<<endl;
	}

private:  //显示定义设为私有权限
	void* operator new(size_t);
	void operator delete(void*);
public:
	int _b;
}; 
void test1()
{
	B b;
	//B* pb=new B();  //编译错误
}

//只能在堆上构造对象,不能在栈上:即不能静态由编译器直接创造对象则只需将构造函数
//与析构函数设为私有的,即类外就不能在栈上自动构造对象(又由于考虑到继承:派生类不能访问基类私有函数,
//则将造成派生类中的父类成员不能成功调用其父类构造函数与析构函数,所以要将构造函数与析构设为protected)
//最后提供接口实现用new生成对象,delete释放对象
class C
{
public:
	static C* Create()  //用静态函数原因:还没有类对象只能用类调用静态函数创造对象
	{
		return new C();   //类内new原因new过程也会调用构造函数,而构造函数现已类外不能访问
	}
	void Destroy()//不用静态函数原因:现已存在对象,可用对象调用此函数
	{
		delete this;   //类内delete与上相同原因,析构函数权限为保护,类外不能访问
	}
protected:  //保护权限考虑继承
	C()
	{
		cout<<"C()"<<endl;
	}
	~C()
	{
		cout<<"~C()"<<endl;
	}
public:
	int _c;
};
void test2()
{
	//C c;
	//C* c=new C();
	C* c=C::Create();
	c->Destroy();
}
int main()
{
	test1();
	test2();
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章