类和对象(拷贝构造函数)

目录

拷贝构造函数

特征

        结论:


拷贝构造函数

        拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存 在的类类型对象创建新对象时由编译器自动调用。

特征

拷贝构造函数也是特殊的成员函数,其特征如下:

        1. 拷贝构造函数是构造函数的一个重载形式。

        2. 拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错, 因为会引发无穷递归调用。

class Date
{
public:Date(int year = 1900, int month = 1, int day = 1){_year = year;_month = month;_day = day;}// Date(const Date& d)   // 正确写法
// 错误写法:编译报错,会引发无穷递归,因为函数调用时,要将d1先传给d,再进行使用Date(const Date d)   {_year = d._year;_month = d._month;_day = d._day;}
private:int _year;int _month;int _day;
};int main()
{Date d1;Date d2(d1);return 0;
}

        3. 若未显式定义,编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按 字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝,这对于地址来说很致命(会导致两个地址存一个相同地址)。

        注意:在编译器生成的默认拷贝构造函数中,内置类型是按照字节方式直接拷贝的,而自定义类型是调用其拷贝构造函数完成拷贝的。

        4. 编译器生成的默认拷贝构造函数已经可以完成字节序的值拷贝了,还需要自己显式实现吗? 当然像日期类这样的类是没必要的。

        注意:类中如果没有涉及资源申请时,拷贝构造函数是否写都可以(例如:Date类);一旦涉及到资源申请(例如:Stack),则拷贝构造函数是一定要写的,否则就是浅拷贝。

        5. 拷贝构造函数典型调用场景:

        使用已存在对象创建新对象

Date d1(2024,4,13);
Date d2=d1;

        函数参数类型为类类型对象

void ADD(Date d)
{}

        函数返回值类型为类类型对象

Date Insert(Date &d)
{}
class Date
{
public:
//构造函数Date(int year, int minute, int day){cout << "Date(int,int,int):" << this << endl;}//拷贝构造函数Date(const Date& d){cout << "Date(const Date& d):" << this << endl;}//析构函数~Date(){cout << "~Date():" << this << endl;}
private:int _year;int _month;int _day;
};Date Test(Date d)
{Date temp(d);//Date temp = d;return temp;
}int main()
{Date d1(2022,1,13);Test(d1);return 0;
}

       

        结论

        1. 如果没有管理资源,一般不写拷贝构造函数,如Date。如果类中自定义类型都已经有了拷贝构造函数没有指针也不用写,例如:MyQueue。

        2. 如果有资源管理或者指针,要写拷贝构造函数。

        本质:不会出现对指针进行浅拷贝

        3. 为了提高程序效率,一般对象传参时,尽量使用引用类型返回时根据实际场景,能用引用尽量使用引用。

这个博客如果对你有帮助,给博主一个免费的点赞就是最大的帮助

欢迎各位点赞,收藏和关注哦

如果有疑问或有不同见解,欢迎在评论区留言哦

后续我会一直分享双一流211西北大学软件(C,数据结构,C++,Linux,MySQL)的学习干货以及重要代码的分享

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

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

相关文章

亚马逊跨境电商崛起,武汉星起航引领新手卖家抢占全球市场

随着全球化的深入推进&#xff0c;跨境电商已成为连接世界贸易的重要桥梁。作为全球最大的电商平台之一&#xff0c;亚马逊正以其强大的物流网络和庞大的用户基础&#xff0c;引领跨境电商业务迅速崛起。业内专家分析指出&#xff0c;亚马逊跨境电商市场有望在未来几年内继续保…

Java+saas模式 智慧校园系统源码Java Android +MySQL+ IDEA 多校运营数字化校园云平台源码

Javasaas模式 智慧校园系统源码Java Android MySQL IDEA 多校运营数字化校园云平台源码 智慧校园即智慧化的校园&#xff0c;也指按智慧化标准进行的校园建设&#xff0c;按标准《智慧校园总体框架》中对智慧校园的标准定义是&#xff1a;物理空间和信息空间的有机衔接&#…

《黑马点评》Redis高并发项目实战笔记(上)P1~P43

P1 Redis企业实战课程介绍 P2 短信登录 导入黑马点评项目 首先在数据库连接下新建一个数据库hmdp&#xff0c;然后右键hmdp下的表&#xff0c;选择运行SQL文件&#xff0c;然后指定运行文件hmdp.sql即可&#xff08;建议MySQL的版本在5.7及以上&#xff09;&#xff1a; 下面这…

顺序表和链表的8道算法题

移除元素 题目连接放这了https://leetcode.cn/problems/remove-element/ 思路一 创建一个新数组&#xff1a;首先遍历原数组的所有数据&#xff0c;把不等于val的值直接放在新数组里&#xff0c;然后返回新数组的长度。由于这个思路不符合题目的要求&#xff0c;所以我们不采…

基于Springboot+Vue的Java项目-旅游网站系统(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

Redis中的集群(八)

集群 设置从节点 向一个节点发送命令: CLUSTER REPLICATE <node_id>可以让接收命令的节点成为node_id所指定节点的从节点&#xff0c;并开始对主节点进行复制: 1.接收到该命令的节点会首先会在自己的clusterState.nodes字典中找到node_id所对应节点的clusterNode结构,…

Web3 的社会影响:数字社会的新时代

随着科技的不断进步和创新&#xff0c;人类社会正逐步进入数字化时代的新阶段。Web3 技术作为数字社会的重要组成部分&#xff0c;正在以前所未有的方式重塑着我们的社会生活和交往方式。本文将探讨 Web3 技术对社会的影响&#xff0c;以及它所带来的数字社会的新时代。 1. Web…

ClickHouse--16--普通函数

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、日期函数1、时间或日期截取函数&#xff08;返回非日期&#xff09;2、时间或日期截取函数&#xff08;返回日期&#xff09;3、日期或时间日期生成函数 二、类…

SD-WAN企业网络部署模式及适用企业类型

随着企业规模的扩张和数字化转型的推进&#xff0c;SD-WAN作为一种灵活、安全和高效的组网解决方案备受关注。那么&#xff0c;SD-WAN在企业网络部署中有哪些常见模式&#xff1f;又有哪些类型的企业最适合采用SD-WAN呢&#xff1f;让我们一起来了解一下&#xff01; 常见的SD-…

【海思Hi3516CV610】是面向新一代视频编解码标准、网络安全和隐私保护、人工智能行业应用方面的IPC SoC

海思Hi3516CV610是面向新一代视频编解码标准、网络安全和隐私保护、人工智能行业应用方面的IPC SoC&#xff0c;除了开发普通摄像机&#xff0c;还可以打造极具竞争力的枪球一体机、双目长短焦摄像机产品&#xff1b; 处理器内核: 支持ARM Cortex-A7 MP2 时钟速率950MHz 支持…

项目5-博客系统4+加密/加盐

1.加密介绍 在MySQL数据库中, 我们常常需要对密码, ⾝份证号, ⼿机号等敏感信息进⾏加密, 以保证数据的安全性. 如果使⽤明⽂存储, 当⿊客⼊侵了数据库时, 就可以轻松获取到⽤⼾的相关信息, 从⽽对⽤⼾或者企业造成信息泄漏或者财产损失. ⽬前我们⽤⼾的密码还是明⽂设置的, …

表格头部合并,数据和表头中间插入合计和样式合并

在做项目时其中一个页面要求和Excel格式一样的页面 html数据&#xff0c;大概写了几个案例如下 <el-table v-loading"loading" :data"tableList" :span-method"mergeRow">//:span-method"mergeRow" 用于合并第一行<el-table…