对象创建限制在堆或栈

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++类对象的创建方式相关推荐

  1. 转 cocos2d-x 3.0 常用对象的创建方式

    cocos2d-x 3.0 中所有对象几乎都可以用create函数来创建,其他的创建方式也是有create函数衍生. 下面来介绍下create函数创建一般对象的方法,省得开发中经常忘记啥的. 1.精灵 ...

  2. C++类对象的创建与释放过程

    C++类对象的创建与释放过程 类的定义与实例化 类对象的创建方法 类对象的创建过程 类对象的释放过程 析构函数 缺省析构函数 类的定义与实例化 类对象的创建方法 1.在栈上创建 类名 对象; // 无 ...

  3. (1029)获得一个类的类对象有哪些方式【基础】

    获得一个类的类对象有哪些方式?[基础] 方法1:类型.class,例如:String.class 方法2:对象.getClass(),例如:"hello".getClass() 方 ...

  4. C++ 控制对象的创建方式和数量

    我们知道,程序内存布局将内存划分为堆.栈.BSS 段.数据段和代码段.既然如此,我们称位于堆上的对象叫堆对象,位于栈上的对象的叫栈对象,位于BSS段和数据段的对象叫全局对象或静态对象.通常情况下,对象 ...

  5. python类的定义和创建_Python类对象的创建和使用

    通过前面章节的学习,我们已经学会如何定义一个类,但要想使用它,必须创建该类的对象. 创建类对象的过程,又称为类的实例化. 类名(参数) 定义类时,如果没有手动添加 __init__() 构造方法,又或 ...

  6. c#类属性和实例属性_Visual C#类和对象的创建方式,定义类,实例化对象,实例讲解...

    定义类 类由class member类成员组成,包含字段.属性.方法和事件.其中字段和属性为类的数据成员,用来存储数据:方法负责数据的传递和运算.使用类之前,要进行声明,声明的语法如下: Class ...

  7. 爬虫-请求类对象的创建-Request类

    Request类 >功能 构建一个请求对象 请求对象可以像url一样被请求 >笔记 例子-构建请求对象 >基本请求信息 >实例化为请求对象 请求类的使用方式 >先看源码 ...

  8. JavaScript对象的创建方式

    JavaScript对象创建 1.直接式 //1.直接创建对象var student = new Object();student.name = "zhangsan";studen ...

  9. activexobject对象不能创建_【设计模式】建造者模式:你创建对象的方式有它丝滑吗?...

    目录 什么是建造者模式 为什么要使用建造者模式 构造函数创建对象 set方式构建对象 java实现建造者模式 第一种实现方式 第二种方式 建造者模式与构造函数的对比 建造者模式与工厂模式的对比 总结 ...

最新文章

  1. 创建ASP.NET WEB自定义控件——例程2
  2. linux用户及权限
  3. linux qt5.9交叉编译,ubuntu16交叉编译Qt5.9
  4. 作用c语言算圆的周长,C语言入门级代码 输入圆的半径求出圆的周长及面积
  5. PCA的数学原理(非常值得阅读)!!!!
  6. C和C++线性表基本概念
  7. SQL 2005安装问题解决办法
  8. CentOS6.5下安装rzsz
  9. 内存,RAM(DDR),ROM(EEPROM、flash),存储卡(emmc,sd,tf)以及Cache的区别与联系
  10. 登陆后保持环境变量导出
  11. webpack打包样式代码去重
  12. oracle加载日记账直服务器,Oracle EBS GL 总账日记账打开报错此职责无可用函数
  13. vue中views新建文件夹的代码规范
  14. 如何用excel制作xy曲线图_如何用excel制作表格?
  15. Transmission搭建BT下载服务器
  16. 小知识--电脑的快捷键
  17. 甲骨文公司总裁Larry Ellison在耶鲁大学的演讲
  18. Week 8: Face Detection
  19. 【Head First 模式设计】第1章 策略模式
  20. C++时间工具类——纳秒,微秒,毫秒,秒,日期

热门文章

  1. 最短网络Agri-Net
  2. hdu--4902--线段树
  3. love2d教程30--文件系统
  4. 前台用js、jquery出现错误很多是由于IE缓存
  5. Eclipse 代码提示无效的解决方法
  6. mysql权限表_MySQL 数据库赋予用户权限操作表
  7. HTML浮动导致高度塌陷,HTML 文档流,设置元素浮动,导致父元素高度无法自适应的解决方法(高度欺骗)...
  8. java semaphore 等待_Java并发编程系列之Semaphore详解
  9. oracle11g日志原理,oracle11gRAC之log日志体系
  10. stm32 薄膜键盘原理_市面上的笔记本键盘优缺点解析,看完秒懂