当前位置: 首页 > news >正文

C++学习之new运算符和静态成员

目录

1.new运算符的基本使用

2.new运算符的注意事项

3.new运算符开辟数组

4.静态成员变量

5.静态成员函数

6.单例模式

7.主席类案例

8.打印机类案例


1.new运算符的基本使用

说明: 我们知道在C语言中,数组一旦声明,就确定了内存的大小,如果想动态进行扩展,就需要自己实现动态数组,将数组创建在堆区。 C中提供了标准函数 malloc、calloc和realloc可以将数据开辟在堆区,free可以释放堆区数据 利用C的方式如果想在C++中实现动态数组的创建我们需要做以下几件事:  计算好数组的大小后,再利用malloc进行申请  malloc返回void*,C++不允许直接给void*赋值到其他类型的指针,需要强转  malloc代码写好后,需要检测内存是否申请成功,进行判断  一些初始化和释放的函数需要手动进行调用,如果忘记则出错 结论: C语言中的动态分配内存较为复杂,因此我们推荐在C++中使用new和delete运算符  

说明: delete用于释放new出来的内存,先调用析构函数,然后释放内存。 正如new表达式返回一个指向对象的指针一样,delete需要一个对象的地址。 delete只适用于由new创建的对象。 如果使用一个由malloc或者calloc或者realloc创建的对象使用delete,这个行为是未定义的。因为大多数new和delete的实现机制都使用了malloc和free,所以很可能没有调用析构函数就释放了内存。 如果正在删除的对象的指针是NULL,将不发生任何事,因此建议在删除指针后,立即把指针赋值为NULL,以免对它删除两次,对一些对象释放两次可能会产生错误

2.new运算符的注意事项

区别: 1、malloc是C创建堆区数据的库函数,new是C++创建堆区数据的运算符 2、malloc对应释放的库函数是free,new对应释放的运算符是delete ,不可以混用 3、malloc返回值是void*, new返回创建对象的指针类型 4、malloc不会调用构造,free不会调用析构,new自动调用构造函数,delete自动调用析构函数 5、malloc需要显式地指出所需内存的大小,new申请内存分配时无需指定内存块的大小,编译器会根据类型自行计算。

3.new运算符开辟数组

说明: 利用new在堆区开辟数组很简单,在类型后面加上中括号,并在中括号中写好数组长度即可 举例: int * pInt = new int[10];           //在堆区开辟10个int类型大小的数组 double* pDouble = new double[10];       //在堆区开辟10个double类型大小的数组 char * pChar = new char[10];           //在堆区开辟10个char类型大小的数组 Person * pArray = new Person[10];      //在堆区开辟10个Person类型大小的数组 注:创建自定义数据类型时,该类型必须有默认构造函数,否则创建失败

4.静态成员变量

说明: 在一个类中,若将一个成员变量前声明为static,这种成员称为静态成员变量。 特点: 与普通成员变量不同,静态成员只有一份,它不属于某个对象,而属于某个类,被所有对象共享 静态成员变量在编译阶段就分配空间,也就是对象还没有创建时,就已经分配空间 静态成员变量必须在类内声明,在类外初始化 静态成员变量可以通过对象或者类名两种方式进行访问 静态成员变量也有访问权限

5.静态成员函数

说明: 在一个类中,若将一个成员函数前声明为static,这种成员称为静态成员函数。 特点: 静态成员函数也只有一份,被所有对象共享 静态成员函数只能访问静态成员变量,而不能访问非静态成员变量 普通成员函数即可以访问静态成员变量,也可以访问非静态成员变量 静态成员函数可以通过对象或者类名两种方式进行访问 静态成员函数也有访问权限

6.单例模式

说明: 单例模式是一种常用的软件设计模式。 在它的核心结构中,只包含一个被称为单例的特殊类。 通过单例模式可以保证系统中一个类只有一个对象,而且该对象易于外界访问,且共用此对象 如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案

7.主席类案例

实现步骤如下: 1、默认构造函数私有化 2、拷贝构造函数私有化 3、私有作用域下,类内声明静态成员指针,类外将指针初始化指向new出的主席对象 4、公共作用域下,提供获取主席指针的唯一接口 5、外界测试接口即可

8.打印机类案例

实现步骤如下: 1、默认构造函数私有化 2、拷贝构造函数私有化 3、私有作用域下,类内声明静态成员指针,类外将指针初始化指向new出的打印机对象 4、公共作用域下,提供获取打印机指针的唯一接口 5、外界测试接口即可 思考: 单例模式对象,是否需要管理释放? 解答: 单例模式由于被共享,释放时机不确定,通常无需管理释放,当程序执行结束会由系统管理释放 而且单例模式对象本身只有1个,不会占用大量内存空间。

相关文章:

  • docker中间件部署
  • 【windows搭建lvgl模拟环境(一)之VSCode】
  • K8S基础知识:DaemonSet、Deployment、StatefulSet的用法区别
  • 六十天前端强化训练之第三十一天之Webpack 基础配置 大师级讲解(接下来几天给大家讲讲工具链与工程化)
  • 机器学习——一元线性回归(算法实现与评估)
  • DeepSeek调用API访问,使用AnythingLLM建立本地知识库后开放API调用,ApiFox/PostMan调用本地DeepSeek
  • 树形结构的工具类TreeUtil
  • 【MySQL】从零开始:掌握MySQL数据库的核心概念(四)
  • 为什么视频文件需要压缩?怎样压缩视频体积即小又清晰?
  • java实现动态修改表数据,方便扩展
  • 【数据转换】- Halcon<->Mat
  • 为Windows10的WSL Ubuntu启动sshd服务并使用Trae远程连接
  • 软考网络工程师上午题
  • AndroidStudio无法识别连接夜神模拟器
  • Android开发:基于 Kotlin 协程的设备指令控制工具类设计与实现
  • Kong 可观测性最佳实践
  • 前端国际化-插件模式
  • Linux网站搭建(新手必看)
  • 项目启动报Error: cannot find module ‘node:path’
  • XXL-Job 处理大数据量并发任务的解决方案及底层原理
  • 同日哑火丢冠,双骄的下山路,手牵手一起走
  • 西部航空回应飞机上卖彩票:与重庆福彩合作,仅部分航班售卖
  • 五大国货美妆去年业绩分化:珀莱雅百亿营收领跑,上海家化转亏
  • 奔驰一季度利润降四成,受美国加征关税影响放弃全年盈利展望
  • 特朗普加征关税冲击波:美国零售、汽车、航空、科技企业纷纷预警业绩波动
  • 铁路上海站今日预计发送旅客65.8万人次,同比增长超16%