限定一个类对象在堆或者栈上创建
来源:互联网 发布:第三只眼监控软件 编辑:程序博客网 时间:2024/06/03 15:00
创建对象通常有两种方法,如下:
第一种方式是静态创建,第二种方式是动态建立。
A a;A *p=new A;
1、静态建立类对象:是由编译器为对象在栈空间中分配内存,是通过直接移动栈顶指针,挪出适当的空间,然后在这片内存空间上调用构造函数形成一个栈对象。使用这种方法,直接调用类的构造函数。
2、动态建立类对象,是使用new运算符将对象建立在堆空间中。这个过程分为两步,第一步是执行operator new()函数,在堆空间中搜索合适的内存并进行分配;第二步是调用构造函数构造对象,初始化这片内存空间。这种方法,间接调用类的构造函数。
1、只能在堆上分配类对象
容易想到将构造函数设为私有。在构造函数私有之后,无法在类外部调用构造函数来构造类对象,只能使用new运算符来建立对象。然而,前面已经说过,new运算符的执行过程分为两步,C++提供new运算符的重载,其实是只允许重载operator new()函数,而operatornew()函数只用于分配内存,无法提供构造功能。因此,这种方法不可以。
当对象建立在栈上面时,是由编译器分配内存空间的,调用构造函数来构造栈对象。当对象使用完后,编译器会调用析构函数来释放栈对象所占的空间。编译器管理了对象的整个生命周期。如果编译器无法调用类的析构函数,情况会是怎样的呢?比如,类的析构函数是私有的,编译器无法调用析构函数来释放内存。所以,编译器在为类对象分配栈空间时,会先检查类的析构函数的访问性,其实不光是析构函数,只要是非静态的函数,编译器都会进行检查。如果类的析构函数是私有的,则编译器不会在栈空间上为类对象分配内存。因此,将析构函数设为私有,类对象就无法建立在栈上了。
这时还要声明一个公有的销毁方法,否则创建的对象将无法销毁。
2、只能在栈上分配类对象
只有使用new运算符,对象才会建立在堆上,因此,只要禁用new运算符就可以实现类对象只能建立在栈上。虽然你不能影响new operator的能力(因为那是C++语言内建的),但是你可以利用一个事实:new operator 总是先调用 operator new,而后者我们是可以自行声明重写的。因此,将operator new()设为私有即可禁止对象被new在堆上。
结论
限制对象在堆中创建,private或protected析构函数
限制对象在栈中创建,private或protected
new operator及new operator []
- 限定一个类对象在堆或者栈上创建
- 只能在栈上或者堆上创建对象
- 只能在栈上或者堆上创建对象
- 只能在栈上或者堆上创建对象
- 让一个类只在堆/栈上创建对象
- 限制一个类对象只在堆上分配或者只在栈上分配
- 如何限制一个类对象只在堆上分配或者只在栈上分配?
- 如何限制一个类对象只在堆上分配或者只在栈上分配?
- 如何限制一个类对象只在堆上分配或者只在栈上分配?
- 如何限制一个类对象只在堆上分配或者只在栈上分配?
- 如何限制一个类对象只在堆上分配或者只在栈上分配?
- 限制一个类对象只在堆上分配或者只在栈上分配
- 让一个类只能在对上创建对象或者只能在栈上实例化
- 设计只能在堆或者栈上创建的类
- 设计只能在堆或者栈上创建的类
- 设计只能在堆或者栈上创建的类
- 设计一个类不能被继承;只能在堆上创建对象;只能在栈上创建对象
- 如何只在堆或者栈上分配类对象
- Oracle LISTENER监听文件参数详解及Lsnrctl命令综述
- 第十三章代码
- EKF(扩展卡尔曼滤波)参数理解
- 7.11 AHDU 4770 Lights Against Dudely
- 设计模式-----单例模式
- 限定一个类对象在堆或者栈上创建
- 栈的相关知识及栈的实现
- hibernate中的多表对应关系
- iOS架构师之路:慎用继承
- Lazarus 将gb2312的MemoryStream转换成String
- 关于Spring RestTemplate乱码问题解决
- linux .so 的使用
- HTML5总结系列(二)--新增表单标签及表单属性
- Gym 100803 B Miscalculation