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

c++转换构造,拷贝构造,operator=

c++转换构造,拷贝构造,operator=

一.转换构造

定义一个类

class CTest {
public:int m_a;CTest(int m_a):m_a(0){}
};

在主函数中定义对象

CTest tes1(1);
CTest tes2 = 5;//我们发现这种定义对象的方式不符合常理,这里其实是发生了隐式类型转换(用到了编译器默认的转换构造函数)

1.转换构造函数

转换构造函数就是可以发生隐式类型转换的构造函数

2.explicit c++关键字

我们可以用这个关键字修饰构造函数,禁止发生隐式类型转换,必须手动显示传递

代码如下

class CTest {
public:int m_a;explicit CTest(int a) :m_a(a) {}
};

在主函数定义对象

CTest tes2 = 4;  //禁止隐式转换,不可用CTest tes5(2);//必须显示传递

二.拷贝构造

定义一个类

class CTest {
public:int m_a;CTest(int a) :m_a(a) {}
};

在主函数中定义对象

CTest tes1(3);CTest tes2(tes1);//我们发现这种定义对象的方式不符合常理,这里其实是发生了拷贝(用到了编译器默认的拷贝构造函数)

1.拷贝构造函数

拷贝构造函数,函数名为:当前类名,参数为 const类对象的引用

函数体代码:编译器提供的,函数代码不为空,形参中对象的成员依次给this对象中的成员做初始化操作,一旦我们手动重构了拷贝构造函数,编译器就不会提供默认的拷贝构造函数了

//如下我们自己手动重构一个拷贝构造函数
CTest(CTest& tes) :m_a(tes.m_a){}

2.浅拷贝与深拷贝

1.浅拷贝

浅拷贝:编译器默认提供的拷贝构造函数,是一个浅拷贝。(上面的拷贝构造函数也是一个浅拷贝)

浅拷贝问题:在类中存在指针成员并申请堆区空间时,拷贝的构造函数只是地址之间的拷贝,会导致多个对象中的指针成员指向了同一块空间,在析构函数回收时,同一块空间被回收多次,程序异常

如下代码定义对象时就会出现问题

class CTest {
public:int m_a;int* p;CTest(int a):m_a(a),p(new int(7)) {}//浅拷贝CTest(CTest& tes) :m_a(tes.m_a),p(tes.p) {cout << __FUNCTION__ << endl;}~CTest() {delete p;p = nullptr;}
};

这时我们就可以用深拷贝来解决这个问题

2.深拷贝

深拷贝我们需要自己手动重构拷贝构造函数

解决:为当前对象中的指针单独开辟一块属于自己的空间,并将值也拷贝过来,这样就不会多次回收同一块空间了,问题得到了解决

代码如下

class CTest {
public:int m_a;int* p;CTest(int a):m_a(a),p(new int(7)) {}//深拷贝CTest(CTest& tes) :m_a(tes.m_a),p(new int(*tes.p)) {}~CTest() {delete p;p = nullptr;}
};

3.禁止拷贝

我们在调用时函数要注意,如果参数是类的对象话,函数参数尽量使用引用、指针,避免值传递,这样就不会发生拷贝,就不会出现浅拷贝问题(当然如果非要用的话,注意要自己重构一个拷贝构造函数—深拷贝)

代码如下

void fun(CTest& tes){}

三.operator=

定义一个类

class Ctest {
public:int m_a;explicit Ctest(int a):m_a(a)){}};

在主函数中定义对象

Ctest tst1(4);
Ctest tst2(3);
tst2 = tst1; //我们发现这里不符合常理,正常来说对象与对象之间不能直接用对象名赋值,其实这里是用到了编译器默认的operator=

1.operator= 函数

在空类中,默认会提供下面的函数,参数为const 当前类对象引用(同拷贝构造一样),返回类型为当前类对象的引用)

编译器默认提供的这个函数函数体代码,形参中对象的成员依次给this对象中的成员做赋值操作,一旦我们手动重构了这个函数,编译器就不会提供默认的了

我们重构一个operator= 函数来模拟一下这个过程

代码如下

Ctest&  operator=(const Ctest& tst1) {this->m_a = tst1.m_a;return *this;
}

2.浅拷贝问题

编译器默认的是浅拷贝,会有浅拷贝问题

如下代码

class Ctest {
public:int m_a;int* m_p = nullptr;explicit Ctest(int a):m_a(a), m_p(new int(5)){}//浅拷贝Ctest&  operator=(const Ctest& tst1) {this->m_a = tst1.m_a;return *this;}~Ctest() {//会回收多次相同的空间delete m_p;m_p = nullptr;}
};

所以这里我们需要手动实现深拷贝来解决这个问题

代码如下

class Ctest {
public:int m_a;int* m_p = nullptr;explicit Ctest(int a):m_a(a), m_p(new int(5)){}//深拷贝Ctest&  operator=(const Ctest& tst) {if (this != &tst) {this->m_a = tst.m_a;if (tst.m_p) {//将代码进行优化,用三目运算符的写法代替if else的写法/*if (this->m_p) {*this->m_p = *tst1.m_p;}else {this->m_p = new int(*tst1.m_p);}}*///三目运算符this->m_p ? *this->m_p = *tst.m_p : (this->m_p = new int(*tst.m_p),0);}else {if (this->m_p) {delete m_p;m_p = nullptr;}}}return *this;}~Ctest() {//会回收多次相同的空间delete m_p;m_p = nullptr;}
};

相关文章:

c++转换构造,拷贝构造,operator=

c转换构造&#xff0c;拷贝构造&#xff0c;operator 一.转换构造 定义一个类 class CTest { public:int m_a;CTest(int m_a):m_a(0){} };在主函数中定义对象 CTest tes1(1); CTest tes2 5;//我们发现这种定义对象的方式不符合常理&#xff0c;这里其实是发生了隐式类型转…...

支付宝蜻蜓设备abs调试

蜻蜓设备系统日志调试 1、蜻蜓设备进入开发者模式 长按关键键直到屏幕上出现设置按钮&#xff0c;点击设置按钮&#xff0c;选择关于本机&#xff0c;找到系统版本&#xff0c;连续点击8次&#xff0c;选择进入调试模式 2、找到小程序容器&#xff0c;连续点击8次&#xff0…...

论memset的时间代价

论memset的时间代价 众所周知&#xff0c;memset是一个常用的数组赋值方式&#xff0c;几乎每个OI player全都使用过&#xff0c;但是这个函数从来不要脸&#xff0c;也不给你脸。 大家耳顺能详的几个例子&#xff1a; ①memset(a,0,sizeof(a));把a全赋值成0。 ②memset(a,…...

linux下绑定进程到指定CPU的操作方法

taskset简介 # taskset Usage: taskset [options] [mask | cpu-list] [pid|cmd [args...]] Show or change the CPU affinity of a process. Options: -a, --all-tasks operate on all the tasks (threads) for a given pid -p, --pid operate on ex…...

springboot+maven插件调用mybatis generator自动生成对应的mybatis.xml文件和java类

mybatis最繁琐的事就是sql语句和实体类&#xff0c;sql语句写在java文件里很难看&#xff0c;字段多的表一开始写感觉阻力很大&#xff0c;没有耐心&#xff0c;自动生成便成了最称心的做法。自动生成xml文件&#xff0c;dao接口&#xff0c;实体类&#xff0c;虽一直感觉不太优…...

C# 根据前台传入实体名称,动态查询数据

前言&#xff1a; 项目中时不时遇到查字典表等数据&#xff0c;只需要返回数据&#xff0c;不需要写其他业务&#xff0c;每个字典表可能都需要写一个接口给前端调用&#xff0c;比较麻烦&#xff0c;所以采用下面这种方式&#xff0c;前端只需传入实体名称即可&#xff0c;例…...

Netty入门学习

目录 为什么要学习nettynetty学习导图学习netty前需要知道的知识I/O模型主要I/O模型 netty框架的整体结构netty的逻辑架构网络通信层事件调度层服务编排层 为什么要学习netty Netty是由JBOSS提供的一个Java开源框架&#xff0c;现为Github上的独立项目。Netty本质是一个NIO框架…...

代客泊车对HUT功能交互规范

目录 1. 版本记录... 7 2. 文档范围和控制... 8 2.1 目的/范围... 8 2.2 文档冲突... 8 2.3 文档授权... 8 2.4 文档更改控制... 8 3. 系统组成... 9 3.1 IPAS系统&#xff08;环视和超声波雷达&#xff09;...…...

mysql的update_time

CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50) NOT NULL,age INT,update_time TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间 );具体解释如下&#xff1a; DEFAULT CURRENT_TIMESTAMP: 这部分表示当插入…...

避免安装这5种软件,手机广告频繁弹窗且性能下降

在我们使用手机的日常生活中&#xff0c;选择合适的应用软件对于保持良好的使用体验至关重要。然而&#xff0c;有些软件可能会给我们带来不必要的麻烦和困扰。特别是那些频繁弹窗广告、导致手机性能下降的应用程序&#xff0c;我们应该尽量避免安装它们。 首先第一种&#xf…...

kafka-事务

1. 事务的5个API // 1初始化事务 void initTransactions();// 2开启事务 void beginTransaction() throws ProducerFencedException;// 3在事务内提交已经消费的偏移量&#xff08;主要用于消费者&#xff09; void sendOffsetsToTransaction(Map<TopicPartition, OffsetAn…...

【安装】阿里云轻量服务器安装Ubuntu图形化界面(端口号/灰屏问题)

阿里云官网链接 https://help.aliyun.com/zh/simple-application-server/use-cases/use-vnc-to-build-guis-on-ubuntu-18-04-and-20-04 网上搜了很多教程&#xff0c;但是我没在界面看到有vnc连接&#xff0c;后面才发现官网有教程。 其实官网很详细了&#xff0c;不过这里还是…...

Python 扩展 快捷贴士:os模块下的创建目录的方式

Python3 os.makedirs() 方法 概述 os.makedirs() 方法用于递归创建多层目录。 如果子目录创建失败或者已经存在&#xff0c;会抛出一个 OSError 的异常&#xff0c;Windows上Error 183 即为目录已经存在的异常错误。 如果第一个参数 path 只有一级&#xff0c;即只创建一层目…...

Hi3798MV200 恩兔N2 NS-1 (一): 设备介绍和刷机说明

目录 Hi3798MV200 恩兔N2 NS-1 (一): 设备介绍和刷机说明Hi3798MV200 恩兔N2 NS-1 (二): HiNAS海纳思使用和修改Hi3798MV200 恩兔N2 NS-1 (三): 制作 Ubuntu rootfsHi3798MV200 恩兔N2 NS-1 (四): 制作 Debian rootfs 介绍 恩兔N2是一个家庭存储的系列产品, NS-1 是其中体积…...

redis缓存雪崩和缓存击穿

目录 缓存雪崩 解决方案&#xff1a; 缓存击穿 ​解决方案 缓存雪崩 缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机&#xff0c;导致大量请求到达数据库&#xff0c;带来巨大压力。 解决方案&#xff1a; u 给不同的 Key 的 TTL 添加随机值 u 利用 Redis …...

计算机网络(5) --- http协议

计算机网络&#xff08;4&#xff09; --- 协议定制_哈里沃克的博客-CSDN博客协议定制https://blog.csdn.net/m0_63488627/article/details/132070683?spm1001.2014.3001.5501 目录 1.http协议介绍 1.协议的延申 2.http协议介绍 3.URL 4.urlencode和urldecode 2.HTTP协…...

ubuntu 硬盘操作

查看移动硬盘的文件系统名 以及空间使用情况 df -hl查看硬盘的格式类型&#xff0c;以及挂载位置 df -T挂载硬盘 fdisk -l #查看磁盘信息 mount -o rw /dev/sdb1 /home/test # 挂载硬盘-o 指定挂载文件系统时的选项 ro 以只读方式挂载 rw 以读写方式挂载 注意&#xff1a;…...

C#垃圾回收器GC、析构函数(Finalize 方法)和Dispose

1、垃圾回收器GC GC&#xff08;Garbage Collection)是.NET中的垃圾回收器。以应用程序的root为基础&#xff0c;遍历应用程序在Heap上动态分配的所有对象&#xff0c;通过识别它们是否被引用&#xff0c;来确定哪些对象是已经死亡的&#xff0c;哪些仍需要被使用。已经不再被…...

第20周 服务容错-Hystrix

RabbitMQ 安装 1. 首先在Linux上进行一些软件的准备工作&#xff0c;yum下来一些基础的软件包 yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c kernel-devel 2. 下载RabbitMQ所需软件包&#xff08;本神在这里使用的是 RabbitM…...

浏览器不同源的页面之间如何跨域通信

目录 1&#xff0c;需求2&#xff0c;难点3&#xff0c;思路浏览器不同源的页面之间如何跨域通信&#xff1f; 4&#xff0c;实现第1版第2版最终版其他的问题1&#xff0c;页面路径需完全一致。2&#xff0c;事件注册问题 1&#xff0c;需求 现在有2个项目&#xff0c;页面路径…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...