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

纯概念

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

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

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/27854.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20240615给飞凌的OK3588-C开发板刷Rockchip原厂的Buildroot后的测试报告

20240615给飞凌的OK3588-C开发板刷Rockchip原厂的Buildroot后的测试报告: 【切记,由于没有替换DTS的,开发板发热量巨大!因此配备鼓风机进行加强散热了】 0、adb 默认没有 1、HDMI IN 4K 2024/6/15 20:32 4K全屏 2、HDMI OUT …

C++ 二分查找法【面试】

在C中实现二分查找法是一个常见的面试问题。二分查找法是一种在有序数组中查找特定元素的算法&#xff0c;其时间复杂度为O(log n)。以下是使用C实现二分查找的示例代码&#xff1a; #include <iostream> #include <vector>// 二分查找法函数 int binarySearch(co…

激活函数(Activation Function)

定义 激活函数&#xff08; A c t i v a t i o n F u n c t i o n Activation\ Function Activation Function&#xff09;是一种添加到人工神经网络中的函数&#xff0c;旨在帮助网络学习数据中的复杂模式。在神经网络中&#xff0c;除了输入层外&#xff0c;隐藏层和输出层的…

Redis原理篇——分布式锁

Redis原理篇——分布式锁 分布式锁是什么&#xff1f;分布式锁有哪些特性&#xff1f;分布式锁常用实现方式Redis 实现分布式锁一、简单的 Redis 锁二、带过期时间的 Redis 锁三、加上 Owner 的 Redis 锁四、Lua 脚本确保原子性 分布式锁是什么&#xff1f; 分布式锁是在分布式…

centos 8 换源

centos 8 换源 进入 root&#xff0c;切换至 yum.repos.d 目录 cd /etc/yum.repos.d/创建新文件夹并将源文件备份为 repo.bak mkdir backup && mv *repo backup/下载国内 yum 源文件 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos…

软件体系结构笔记(自用)

来自《软件体系结构原理、方法与实践&#xff08;第三版&#xff09;》清华大学出版社 张友生编著 1-8章12章 复习笔记 如有错误&#xff0c;欢迎指正&#xff01;&#xff01;&#xff01;

HCIP认证笔记(填空)

1、为防止攻击者伪造BGP报文对设备进行攻击,可以通过配置GTSM功能检测IP报文中的TTL值的范围来对设备进行保护。如果某台设备配置了“peer x.x.x.x valid-ttl-hops 100",则被检测的报文的TTL值的有效范围为【(156),255】; 解析: peer {group-name | ipv4-address…

学习cel-go了解一下通用表达语言评估是什么

文章目录 1. 前言2. cel-go2.1 cel-go关键概念Applications(应用)Compilation(编译)Expressions(表达式)Environment环境解析表达式的三个阶段 3. cel-go的使用4. cel-go使用5. 说明6. 小结7. 参考 1. 前言 最近因为在项目里面实现的一个使用和||来组合获取字段值的功能有点儿…

MySQL员工练习

MySQL员工练习 1.数据显示 员工信息表emp&#xff1a; 字段&#xff1a;员工id,员工名字,工作岗位,部门经理,受雇日期,薪水,奖金,部门编号 英文名&#xff1a;EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,BONUS,DEPTNO 部门信息表dept&#xff1a; 字段&#xff1a;部门编号,部门名称,部…

自然抽样和平顶抽样

自然抽样和平顶抽样是两种信号处理和采样技术&#xff0c;它们在音频信号处理、信号重建以及数字信号处理中有着不同的应用。 1. 自然抽样&#xff08;也称为理想抽样或无失真抽样&#xff09;&#xff1a;样值脉冲的幅度随原始信号m(t)的幅度而变&#xff1b; 自然抽样过程的…

Java算法常用技巧

一、排序 资料&#xff1a;https://blog.csdn.net/weixin_72499901/article/details/136592073 正排序 import java.util.Arrays;public class SortArray {public static void main(String[] args) {int[] citations {5, 3, 8, 2, 1, 4};// 打印原数组System.out.println(&…

windows10或者windows11怎么查看自己电脑显卡型号

win10系统&#xff1a; 右键单击任务栏后弹出菜单选择任务管理器 打开任务管理器后&#xff0c;点击性能查看左侧GPU0或者GPU1 如果有nvidia字样表示自己电脑有nvidia显卡&#xff0c;如果是AMD或者intel字样表示没有nvidia显卡。注意如果你有GPU0或者GPU1说明你电脑是双显卡&…

后端中缓存的作用以及基于Spring框架演示实现缓存

缓存的作用及演示 现在我们使用的程序都是通过去数据库里拿数据然后展示的 长期对数据库进行数据访问 这样数据库的压力会越来越大 数据库扛不住了 创建了一个新的区域 程序访问去缓存 缓存区数据库 缓存里放数据 有效降低数据访问的压力 我们首先进行一个演示 为了演示…

spring boot配置ssl证书,支持https访问

1. 阿里云官网下载证书,云控制台搜索ssl&#xff0c;点击进入。 2.点击免费证书&#xff0c;立即购买。 3. 点击创建证书&#xff0c;填写完证书申请后&#xff0c;等待证书签发。 4. 证书签发以后&#xff0c;点击下载证书&#xff0c;spring boot选tomcat服务器类型的。 5. …

[机缘参悟-198] - 互联网时代正在逐渐消融原先的金字塔结构的企业管理架构,管理者转变成创业者是大公司是新的游戏法则,大公司转变成孵化创业的生态和平台

目录 前言&#xff1a; 一、四次工业革命 1.1 概述 1.2 引发的社会变化 二、信息革命&#xff1a;互联网、移动互联网时代特点 2.1 技术的变化&#xff1a;数字化、信息化 2.2 个体的崛起&#xff1a;个人IP化 2.3 组织架构的变化&#xff1a;扁平化 2.4 软件开发的扁…

Android开发更改JDK版本

今天在跑GitHub上面一个Android项目时&#xff0c;在Android编译时出现如下错误&#xff1a; Unsupported Java. Your build is currently configured to use Java 17.0.2 and Gradle 7.0.2.错误原因&#xff1a; JDK和Gradle版本对应出错。 本地的JDK为1.8正好可以更改为本…

跨境电商测评、采购大额下单自养号需要解决哪些技术原理?

市场上有许多伪装工具&#xff0c;但大多数只是为了方便开发人员测试系统程序&#xff0c;它们并不能针对特定的电商平台进行伪装。每个电商平台都有其独特的风控机制&#xff0c;因此&#xff0c;我们需要从硬件环境的底层配合软件控制&#xff0c;以满足各平台的检测规则。 …

永磁同步直线电机(PMLSM)控制与仿真4-永磁同步直线电机数学三环闭环控制仿真

文章目录 1、参数设置及脚本2、相电流波形3、位置波形4、速度波形5、控制电流波形6、永磁同步直线电机在实际控制中如何控制参考 写在前面&#xff1a;原本为一篇文章写完了永磁同步直线电机数学模型介绍&#xff0c;永磁同步直线电机数学模型搭建&#xff0c;以及永磁同步直线…

Jacob环境探索(兼容性、管理员、DLL位置、VS环境,COM权限)

概述&#xff1a; 最近在生产开发实践出现了很多问题&#xff0c;经过了一系列排查&#xff0c;特做如下总结 探索成果&#xff1a; 1. jacob.dll的建议位置 首先jacob的官网&#xff0c;以及官方GitHub&#xff0c;你可以从这里找到DLL文件&#xff0c;以及相关资料然后DLL文…

【APP移动端自动化测试】第一节.环境配置和adb调试工具

文章目录 前言一、Java环境搭建二、AndroidSDK环境搭建三、Android模拟器安装四、adb调试工具基本介绍 4.1 adb构成和基本原理 4.2 adb获取包名&#xff0c;界面名 4.3 adb文件传输 4.4 adb获取app启动时间 4.5 adb获取手机日志 4.6 adb其他有关…