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转换构造,拷贝构造,operator 一.转换构造 定义一个类 class CTest { public:int m_a;CTest(int m_a):m_a(0){} };在主函数中定义对象 CTest tes1(1); CTest tes2 5;//我们发现这种定义对象的方式不符合常理,这里其实是发生了隐式类型转…...
支付宝蜻蜓设备abs调试
蜻蜓设备系统日志调试 1、蜻蜓设备进入开发者模式 长按关键键直到屏幕上出现设置按钮,点击设置按钮,选择关于本机,找到系统版本,连续点击8次,选择进入调试模式 2、找到小程序容器,连续点击8次࿰…...
论memset的时间代价
论memset的时间代价 众所周知,memset是一个常用的数组赋值方式,几乎每个OI player全都使用过,但是这个函数从来不要脸,也不给你脸。 大家耳顺能详的几个例子: ①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语句和实体类,sql语句写在java文件里很难看,字段多的表一开始写感觉阻力很大,没有耐心,自动生成便成了最称心的做法。自动生成xml文件,dao接口,实体类,虽一直感觉不太优…...
C# 根据前台传入实体名称,动态查询数据
前言: 项目中时不时遇到查字典表等数据,只需要返回数据,不需要写其他业务,每个字典表可能都需要写一个接口给前端调用,比较麻烦,所以采用下面这种方式,前端只需传入实体名称即可,例…...
Netty入门学习
目录 为什么要学习nettynetty学习导图学习netty前需要知道的知识I/O模型主要I/O模型 netty框架的整体结构netty的逻辑架构网络通信层事件调度层服务编排层 为什么要学习netty Netty是由JBOSS提供的一个Java开源框架,现为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系统(环视和超声波雷达)...…...
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 更新时间 );具体解释如下: DEFAULT CURRENT_TIMESTAMP: 这部分表示当插入…...
避免安装这5种软件,手机广告频繁弹窗且性能下降
在我们使用手机的日常生活中,选择合适的应用软件对于保持良好的使用体验至关重要。然而,有些软件可能会给我们带来不必要的麻烦和困扰。特别是那些频繁弹窗广告、导致手机性能下降的应用程序,我们应该尽量避免安装它们。 首先第一种…...
kafka-事务
1. 事务的5个API // 1初始化事务 void initTransactions();// 2开启事务 void beginTransaction() throws ProducerFencedException;// 3在事务内提交已经消费的偏移量(主要用于消费者) 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 网上搜了很多教程,但是我没在界面看到有vnc连接,后面才发现官网有教程。 其实官网很详细了,不过这里还是…...
Python 扩展 快捷贴士:os模块下的创建目录的方式
Python3 os.makedirs() 方法 概述 os.makedirs() 方法用于递归创建多层目录。 如果子目录创建失败或者已经存在,会抛出一个 OSError 的异常,Windows上Error 183 即为目录已经存在的异常错误。 如果第一个参数 path 只有一级,即只创建一层目…...
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缓存雪崩和缓存击穿
目录 缓存雪崩 解决方案: 缓存击穿 解决方案 缓存雪崩 缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。 解决方案: u 给不同的 Key 的 TTL 添加随机值 u 利用 Redis …...
计算机网络(5) --- http协议
计算机网络(4) --- 协议定制_哈里沃克的博客-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查看硬盘的格式类型,以及挂载位置 df -T挂载硬盘 fdisk -l #查看磁盘信息 mount -o rw /dev/sdb1 /home/test # 挂载硬盘-o 指定挂载文件系统时的选项 ro 以只读方式挂载 rw 以读写方式挂载 注意:…...
C#垃圾回收器GC、析构函数(Finalize 方法)和Dispose
1、垃圾回收器GC GC(Garbage Collection)是.NET中的垃圾回收器。以应用程序的root为基础,遍历应用程序在Heap上动态分配的所有对象,通过识别它们是否被引用,来确定哪些对象是已经死亡的,哪些仍需要被使用。已经不再被…...
第20周 服务容错-Hystrix
RabbitMQ 安装 1. 首先在Linux上进行一些软件的准备工作,yum下来一些基础的软件包 yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c kernel-devel 2. 下载RabbitMQ所需软件包(本神在这里使用的是 RabbitM…...
浏览器不同源的页面之间如何跨域通信
目录 1,需求2,难点3,思路浏览器不同源的页面之间如何跨域通信? 4,实现第1版第2版最终版其他的问题1,页面路径需完全一致。2,事件注册问题 1,需求 现在有2个项目,页面路径…...
FontForge终极指南:免费开源字体编辑器从零到精通
FontForge终极指南:免费开源字体编辑器从零到精通 【免费下载链接】fontforge Free (libre) font editor for Windows, Mac OS X and GNULinux 项目地址: https://gitcode.com/gh_mirrors/fo/fontforge FontForge是一款完全免费的开源字体编辑器,…...
RimWorld模组管理终极指南:3步掌握RimSort智能排序,告别游戏崩溃烦恼
RimWorld模组管理终极指南:3步掌握RimSort智能排序,告别游戏崩溃烦恼 【免费下载链接】RimSort RimSort is an open source mod manager for the video game RimWorld. There is support for Linux, Mac, and Windows, built from the ground up to be a…...
2026 论文双检突围:9 款查重降重降 AIGC 工具硬核横评,Paperxie 领跑全场景通关
paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPThttps://www.paperxie.cn/weight?type1https://www.paperxie.cn/weight?type1 毕业季论文查重飘红、AIGC 率爆表,已成为无数本科生与研究生的 “双重噩梦”。2026 年知网、维普全面升级…...
暗黑3终极宏工具D3KeyHelper:5分钟配置你的自动战斗系统
暗黑3终极宏工具D3KeyHelper:5分钟配置你的自动战斗系统 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper D3KeyHelper是一款专为暗黑破坏神…...
统计显著性骗局
原文:towardsdatascience.com/the-statistical-significance-scam-db904be36714?sourcecollection_archive---------0-----------------------#2024-11-09 深入剖析科学最爱工具的缺陷 https://medium.com/caiparryjones96?sourcepost_page---byline--db904be367…...
3分钟免费加速GitHub:告别龟速下载的终极解决方案
3分钟免费加速GitHub:告别龟速下载的终极解决方案 【免费下载链接】Fast-GitHub 国内Github下载很慢,用上了这个插件后,下载速度嗖嗖嗖的~! 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 还在为GitHub的缓慢下…...
如何快速实现GitHub界面全面中文化:3分钟安装终极汉化插件
如何快速实现GitHub界面全面中文化:3分钟安装终极汉化插件 【免费下载链接】github-chinese GitHub 汉化插件,GitHub 中文化界面。 (GitHub Translation To Chinese) 项目地址: https://gitcode.com/gh_mirrors/gi/github-chinese GitHub中文插件…...
生产报工软件哪个好用?工厂扫码报工神器:企丰小工单详细介绍
现在很多中小型加工厂、五金机械、汽配、组装制造工厂,还在使用纸质单据手写报工。每天员工手写工单、文员加班录表、月底核算计件工资头疼不已。不仅工序混乱、产量统计不准,还容易出现虚报产量、工序漏报、薪资对账纠纷等问题。想要数字化管理…...
C166编译器内联展开机制与嵌入式性能优化
1. C166编译器运行时库函数的内联展开机制解析在嵌入式开发领域,C166架构因其高效的实时性能被广泛应用于工业控制领域。作为长期使用Keil C166工具链的开发者,我发现编译器对标准库函数的内联优化处理直接影响着代码的执行效率和内存占用。本文将深入剖…...
VMware 17 开机自启实战:从配置到故障排查的完整指南
1. VMware 17开机自启基础配置 很多运维工程师在生产环境中都会遇到这样的需求:让VMware虚拟机像系统服务一样随宿主机自动启动。这个功能对于无人值守的服务器、工控机等场景特别重要。下面我就以VMware Workstation 17为例,手把手教你配置全过程。 首…...
