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

c++ 设计类的时的构造函数和析构函数的注意事项

纯概念

          类和对象是c++里非常重要的概念。类属于一种数据类型,是根据业务逻辑,封装一些成员变量(数据部分)和成员函数(逻辑部分)。业务逻辑使用时,类可以实例化成对象。其中,在实例化对象的过程中,构造函数起到非常重要的作用。构造函数又分为以下几种:

  • 默认构造函数,简单的说,就是没有参数的构造函数。
  • 拷贝构造函数, 形式是这样的  类名类名&)。
  • 赋值构造函数,重载类的=操作符就能实现类的赋值构造函数。

    一般情况下,初级c++程序员对构造函数,不太关注,直接设计成员变量和成员方法,就完事了。在成员变量都是基本类型的场景下完全使用编译器自动生成的构造函数是OK的,因为,c++的编译器会默认帮您合成以上所述的三种类型的构造函数。其作用如下:

  • 默认构造函数,将基本类型,比如int, char, uint8_t .....等成员变量都初始化为0了。
  •  拷贝构造函数和赋值构造函数,在您使用也都默认的 一个bit一个bit的从源对象,拷贝给目标对象,制造出一个一模一样的新对象。基本对象,成员变量的内存地址都属于类对象本身,所以没有问题,成员函数对成员变量的逻辑操作都是有保障的。

     另外一种场景,成员变量中有指针时,以上三种构造函数,都使用编译器自动生成时,会有风险。比如,你使用正在使用一个对象,处理某种业务,其中有一个成员变量是指针,您也为成员指针开辟了一个link对象。此时,您无意识下,对此对象使用了拷贝构造,或者赋值构造。这样做的结果就是,新对象的成员指针和源对象的指针同时指向之前link的同一对象。在无意识的情况下,新旧两个成员指针变量,对同一块内存对象都进行逻辑操作,会很容易引发bug。当您析构这两个成员指针时,可能会出现先后析构同一对象,造成程序崩溃的可能。

      怎么处理呢?有2个思路,

  • 第一就是,设计类的时候就,明确告知编译器,使用delete关键字,不允许实现拷贝构造函数和赋值构造函数。这样,你无意识使用拷贝和赋值构造函数时,编译器就会报错,及时提示程序员,不能使用拷贝和构造函数。
  • 第二,你设计时,就知道,必须要使用拷贝构造和赋值构造函数,此时,你自己实现它们,此时,你是清楚的知道成员指针变量,必须为它创造一个新的空间,新空间内放入源对象成员指针变量指向的对象。

相关文章:

  • 【CT】LeetCode手撕—141. 环形链表
  • UniApp+Vue3使用Vant-微信小程序组件
  • 基于springboot实现火锅店管理系统项目【项目源码+论文说明】
  • Python读取wps中的DISPIMG图片格式
  • C#类继承示例以及使用注意事项
  • cdh中的zookeeper怎么配置zoo.cfg
  • Arduino入门2——常用函数及用法
  • 实战计算机网络02——物理层
  • 免费个人站 独立站 wordpress 自建网站
  • linux 部署瑞数6实战(维普,药监局)sign第二部分
  • [C++] 小游戏 斗破苍穹 2.11.6 版本 zty出品
  • JVM原理之运行时数据区域
  • 【深度学习】 深入浅出:人脸识别技术的步骤、实现与匹配方法,如何进行人脸识别?
  • 基于Python+OpenCV高速公路行驶车辆的速度检测系统
  • 外包公司泛滥,这些常识你应该提前知道?
  • 345-反转字符串中的元音字母
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • CODING 缺陷管理功能正式开始公测
  • Django 博客开发教程 16 - 统计文章阅读量
  • E-HPC支持多队列管理和自动伸缩
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • nodejs:开发并发布一个nodejs包
  • Vue UI框架库开发介绍
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 因为阿里,他们成了“杭漂”
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 进程与线程(三)——进程/线程间通信
  • #{}和${}的区别?
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (007)XHTML文档之标题——h1~h6
  • (13)DroneCAN 适配器节点(一)
  • (2024)docker-compose实战 (8)部署LAMP项目(最终版)
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (二)测试工具
  • (力扣题库)跳跃游戏II(c++)
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • .bat批处理出现中文乱码的情况
  • .cn根服务器被攻击之后
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .Net Core中的内存缓存实现——Redis及MemoryCache(2个可选)方案的实现
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • ??在JSP中,java和JavaScript如何交互?
  • @ModelAttribute使用详解
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决
  • [AHOI2009]中国象棋 DP,递推,组合数
  • [Android]创建TabBar