c++类对象的创建方式
对象创建限制在堆或栈
c++类对象的创建方式
- 对象创建限制在堆或栈
- C++ 中的类的对象的建立模式
- 如何将类限制在堆上呢?
C++ 中的类的对象的建立模式
C++ 中的类的对象的建立模式分为两张:静态建立,动态建立
- 静态建立:由编译器为对象在栈空间上分配内存,直接调用类的构造函数创建对象。例如:A a;
- 动态建立:使用 new 关键字在堆空间上创建对象,底层首先调用 operator new() 函数,在堆空间上寻找合适的内存并分配;然后,调用类的构造函数创建对象。例如:A *p = new A();
如何将类限制在堆上呢?
直观的想法就是将构造函数设置为private这样,静态建立就无法创建对象,那么动态建立可以吗?同样不行,因为动态创建饶了半天,也需要调用构造函数
方法一:
将析构函数设置为私有,原因:静态对象建立在栈上,是由编译器分配和释放内存空间,编译器为对象分配内存空间时,会对类的非静态函数进行检查,即编译器会检查析构函数的访问性。当析构函数设为私有时,编译器创建的对象就无法通过访问析构函数来释放对象的内存空间,因此,编译器不会在栈上为对象分配内存。
class A
{public:A() {}void destory(){delete this;}private:~A(){}
};
- 但是这个方法有个问题,就是外部用delete的时候,析构函数由于是私有的,就无法释放空间。那么就需要在内部实现delete释放空间。
- 继承的时候,如果基类将析构函数设置为虚函数,派生类重写该虚函数来实现多态,由于基类析构函数是私有的,派生类就无法访问。
方法二:
构造函数设置为 protected,并提供一个 public 的静态函数来完成构造,而不是在类的外部使用 new 构造;将析构函数设置为 protected。原因:类似于单例模式,也保证了在派生类中能够访问析构函数。通过调用 create() 函数在堆上创建对象。
class A
{protected:A() {}~A() {}public:static A *create(){return new A();}void destory(){delete this;}
};
限制对象只能建立在栈上:
解决方法:将 operator new() 设置为私有。原因:当对象建立在堆上时,是采用 new 的方式进行建立,其底层会调用 operator new() 函数,因此只要对该函数加以限制,就能够防止对象建立在堆上。
class A
{private:void *operator new(size_t t) {} // 注意函数的第一个参数和返回值都是固定的void operator delete(void *ptr) {} // 重载了 new 就需要重载 delete
public:A() {}~A() {}
};
c++类对象的创建方式相关推荐
- 转 cocos2d-x 3.0 常用对象的创建方式
cocos2d-x 3.0 中所有对象几乎都可以用create函数来创建,其他的创建方式也是有create函数衍生. 下面来介绍下create函数创建一般对象的方法,省得开发中经常忘记啥的. 1.精灵 ...
- C++类对象的创建与释放过程
C++类对象的创建与释放过程 类的定义与实例化 类对象的创建方法 类对象的创建过程 类对象的释放过程 析构函数 缺省析构函数 类的定义与实例化 类对象的创建方法 1.在栈上创建 类名 对象; // 无 ...
- (1029)获得一个类的类对象有哪些方式【基础】
获得一个类的类对象有哪些方式?[基础] 方法1:类型.class,例如:String.class 方法2:对象.getClass(),例如:"hello".getClass() 方 ...
- C++ 控制对象的创建方式和数量
我们知道,程序内存布局将内存划分为堆.栈.BSS 段.数据段和代码段.既然如此,我们称位于堆上的对象叫堆对象,位于栈上的对象的叫栈对象,位于BSS段和数据段的对象叫全局对象或静态对象.通常情况下,对象 ...
- python类的定义和创建_Python类对象的创建和使用
通过前面章节的学习,我们已经学会如何定义一个类,但要想使用它,必须创建该类的对象. 创建类对象的过程,又称为类的实例化. 类名(参数) 定义类时,如果没有手动添加 __init__() 构造方法,又或 ...
- c#类属性和实例属性_Visual C#类和对象的创建方式,定义类,实例化对象,实例讲解...
定义类 类由class member类成员组成,包含字段.属性.方法和事件.其中字段和属性为类的数据成员,用来存储数据:方法负责数据的传递和运算.使用类之前,要进行声明,声明的语法如下: Class ...
- 爬虫-请求类对象的创建-Request类
Request类 >功能 构建一个请求对象 请求对象可以像url一样被请求 >笔记 例子-构建请求对象 >基本请求信息 >实例化为请求对象 请求类的使用方式 >先看源码 ...
- JavaScript对象的创建方式
JavaScript对象创建 1.直接式 //1.直接创建对象var student = new Object();student.name = "zhangsan";studen ...
- activexobject对象不能创建_【设计模式】建造者模式:你创建对象的方式有它丝滑吗?...
目录 什么是建造者模式 为什么要使用建造者模式 构造函数创建对象 set方式构建对象 java实现建造者模式 第一种实现方式 第二种方式 建造者模式与构造函数的对比 建造者模式与工厂模式的对比 总结 ...
最新文章
- 创建ASP.NET WEB自定义控件——例程2
- linux用户及权限
- linux qt5.9交叉编译,ubuntu16交叉编译Qt5.9
- 作用c语言算圆的周长,C语言入门级代码 输入圆的半径求出圆的周长及面积
- PCA的数学原理(非常值得阅读)!!!!
- C和C++线性表基本概念
- SQL 2005安装问题解决办法
- CentOS6.5下安装rzsz
- 内存,RAM(DDR),ROM(EEPROM、flash),存储卡(emmc,sd,tf)以及Cache的区别与联系
- 登陆后保持环境变量导出
- webpack打包样式代码去重
- oracle加载日记账直服务器,Oracle EBS GL 总账日记账打开报错此职责无可用函数
- vue中views新建文件夹的代码规范
- 如何用excel制作xy曲线图_如何用excel制作表格?
- Transmission搭建BT下载服务器
- 小知识--电脑的快捷键
- 甲骨文公司总裁Larry Ellison在耶鲁大学的演讲
- Week 8: Face Detection
- 【Head First 模式设计】第1章 策略模式
- C++时间工具类——纳秒,微秒,毫秒,秒,日期
热门文章
- 最短网络Agri-Net
- hdu--4902--线段树
- love2d教程30--文件系统
- 前台用js、jquery出现错误很多是由于IE缓存
- Eclipse 代码提示无效的解决方法
- mysql权限表_MySQL 数据库赋予用户权限操作表
- HTML浮动导致高度塌陷,HTML 文档流,设置元素浮动,导致父元素高度无法自适应的解决方法(高度欺骗)...
- java semaphore 等待_Java并发编程系列之Semaphore详解
- oracle11g日志原理,oracle11gRAC之log日志体系
- stm32 薄膜键盘原理_市面上的笔记本键盘优缺点解析,看完秒懂