只能在堆上分配空间的类和只能在栈上分配空间的类
2013-12-09 09:00
197 查看
using namespace std;
class HeapOnly
{
public:
HeapOnly() { cout << "constructor." << endl; }
void destroy () const { delete this; }
private:
~HeapOnly() {}
};
int main()
{
HeapOnly *p = new HeapOnly;
p->destroy();
// HeapOnly h;
// h.Output();
return 0;
}
//StackOnly.cpp
//2005.07.18------2009.06.05
#include <iostream>
using namespace std;
class StackOnly
{
public:
StackOnly() { cout << "constructor." << endl; }
~StackOnly() { cout << "destructor." << endl; }
private:
void* operator new (size_t);
};
int main()
{
StackOnly s; //okay
StackOnly *p = new StackOnly; //wrong
return 0;
}
其实道理很简单,前者利用了c++的重载机制+访问控制机制。后者利用了c++的访问控制机制。
前者重载了new运算符,并设为私有,因此,当用 new stackonly;时编译器就会报错。
后者则将构造函数设为私有,因此,当你 heaponly h;时会自动调用构造函数,这时编译器也会报错。
这种技巧在c++中是很常用的比如设计模式中的单件模式。
相关文章推荐
- 类对象只能在堆上分配空间的方法
- 【转】C++怎么设计只能在堆或者栈分配空间的类以及定义一个不能被继承的类
- 域用户自动映射文件服务器分配的空间(只能自己看到,其它域用户无查看权限)
- 编写C++中的两个类 一个只能在栈中分配空间 一个只能在堆中分配(腾讯2012面试题)
- 编写C++中的两个类 一个只能在栈中分配空间 一个只能在堆中分配
- 静态数据成员只能在类体外,且通过函数体进行初始化(静态数据成员是在程序编译时被分配空间的)
- 编写C++中的两个类 一个只能在栈中分配空间 一个只能在堆中分配
- 如何让类对象只能在堆(栈)上分配空间
- [面试] 编写C++中的两个类 一个只能在栈中分配空间 一个只能在堆中分配 (Very Good! tx)
- [面试] 编写C++中的两个类 一个只能在栈中分配空间 一个只能在堆中分配 (Very Good! tx)
- 一个只能在栈中分配空间和一个只能在堆中分配的类
- 编写C++中的两个类 一个只能在栈中分配空间 一个只能在堆中分配
- 编写C++中的两个类 一个只能在栈中分配空间 一个只能在堆中分配。
- HashMap 与 ConcurrentHashMap 在初始化不同大小容量时,实际分配的空间情况
- 线段树分配空间大小问题
- 创建用户及表空间分配权限
- 能不能只分配内存空间,不赋初始值呢?
- 【转】结构体的内存空间分配原理
- Sql Server 管理区分配(GAM,SGAM)和可用空间(PAM)的原理
- xp下用户程序空间分配(3):加载文件