当前位置: 首页 > 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;页面路径…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...