设计一个只能在堆上或栈上实例化的类
来源:互联网 发布:免费发外链软件 编辑:程序博客网 时间:2024/06/07 15:05
一道C++笔试题:设计一个只能在堆内存上实例化的类和一个只能在栈内存上实例化的类
只能在堆内存上实例化的类:将析构函数定义为private,在栈上不能自动调用析构函数,只能手动调用。也可以将构造函数定义为private,但这样需要手动写一个函数实现对象的构造。
只能在栈内存上实例化的类:将函数operator new和operator delete定义为private,这样使用new操作符创建对象时候,无法调用operator new,delete销毁对象也无法调用operator delete。
#include <iostream>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(){ //use of CHeapOnly CHeapOnly* pHeap = new CHeapOnly; pHeap->Destroy(); //error use of CHeapOnly //CHeapOnly objHeap; //use of CStackOnly CStackOnly objStack; //error use of CStackOnly //CStackOnly* pStack = new CStackOnly; return 0;}
下面一个类也只能在堆内存上生成,将构造函数和析构函数都定义为private,但是可以通过类的static函数创建对象,不过这个对象是不能被继承的。
#include <iostream>using namespace std;//只能在堆内存上实例化的类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(){ //use of CHeapOnly FinalClass* fc = FinalClass::GetInstance(); FinalClass::DeleteInstance(fc); return 0;}
0 0
- 设计一个只能在堆上或栈上实例化的类
- 设计一个只能在堆上或栈上实例化的类
- 设计一个只能在堆上或栈上实例化的类
- 设计一个只能在堆上或栈上实例化的类
- 设计一个只能在堆上或栈上实例化的类
- 设计一个只能在堆上或栈上实例化的类
- 设计一个只能在堆上或栈上的类
- 限定只能在栈或堆上实例化的类
- 如何定义一个只能在堆上(或栈上)生成对象的类
- 怎么限制一个类的对象实例,只能在"堆"上分配,或者只能在"栈"上分配
- 设计一个类只能在堆(栈)上创建
- [C++]限制一个类的对象只能在栈或堆上创建
- 如何定一个只能在堆上或者只能在栈上定义的类
- C++限制一个类只能在堆上或栈上分配
- 设计只能在堆或者栈上创建的类
- 设计只能在堆或者栈上创建的类
- 设计只能在堆或者栈上创建的类
- 创建一个不能被继承的类和只能在堆上(或栈上)创建对象
- 数量的变量
- CSS字体大小: em与px、pt、百分比之间的对比
- Qt——编译错误总结
- newlisp通过JavaScript查询MongoDB记录
- WM_CTLCOLOR消息
- 设计一个只能在堆上或栈上实例化的类
- [the c programming language]-2章:类型、运算符与表达式
- 开博客了
- Kivy A to Z -- 如何从Python创建一个基于Binder的Service及如何从Java访问Python创建的Service
- WM_CTLCOLOR消息
- 多媒体的选取和录制
- java web开发入门笔记 之 web 配置文件
- 欢迎使用新浪博客推广软件
- 【编程之美】一些细节的总结