我们专注攀枝花网站设计 攀枝花网站制作 攀枝花网站建设
成都网站建设公司服务热线:400-028-6601

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

设计一个只能在堆内存上实例化的类和一个只能在栈内存上实例化的类

只能在堆内存上实例化的类:将析构函数定义为private,在栈上不能自动调用析构函数,只能手动调用。也可以将构造函数定义为private,但这样需要手动写一个函数实现对象的构造。

网站建设哪家好,找成都创新互联!专注于网页设计、网站建设、微信开发、微信小程序定制开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了桂平免费建站欢迎大家使用!

只能在栈内存上实例化的类:将函数operator new和operator delete定义为private,这样使用new操作符创建对象时候,无法调用operator new,delete销毁对象也无法调用operator delete。

#include 
using namespace std;

//只能在堆内存上实例化的类
class CHeapOnly
{
public:
	CHeapOnly()
	{
		cout << "Constructor of CHeapOnly!" << endl;
	}

	void Destroy() const
	{
		delete this;
	}

private:
	~CHeapOnly()
	{
		cout << "Destructor of CHeapOnly!" << endl;
	}
};

//只能在栈内存上实例化的类,就是不能使用new来构造类,把operator new私有化
class CStackOnly
{
public:
	CStackOnly()
	{
		cout << "Constructor of CStackOnly!" << endl;
	}

	~CStackOnly()
	{
		cout << "Destrucotr of CStackOnly!" << endl;
	}

private:
	void* operator new(size_t size)
	{
	}

	void operator delete(void * ptr)
	{
	}
};

int main()
{
	CHeapOnly* pHeap = new CHeapOnly;
	pHeap->Destroy();
	CStackOnly objStack;
	return 0;
}
//只能在堆内存上实例化的类
// 下面一个类也只能在堆内存上生成,将构造函数和析构函数都定义为private,
//但是可以通过类的static函数创建对象,不过这个对象是不能被继承的。
class FinalClass
{
public:
	static FinalClass* GetInstance()
	{
		cout << "Constructor of the class" << endl;
		return new FinalClass;
	}

	static void DeleteInstance(FinalClass* pInstance)
	{
		cout << "Destructor of the class" << endl;
		delete pInstance;
		pInstance = 0;
	}

private:
	FinalClass() {}
	~FinalClass() {}
};

int main()
{
	FinalClass* fc = FinalClass::GetInstance();
	FinalClass::DeleteInstance(fc);

	return 0;
}

网站名称:设计一个只能在堆内存上实例化的类和一个只能在栈内存上实例化的类
标题路径:http://shouzuofang.com/article/ijsege.html

其他资讯