[C++ 从入门到精通] 12.拷贝构造函数

  • 📢博客主页:https://loewen.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 丶布布原创,首发于 CSDN,转载注明出处🙉
  • 📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨

文章预览:

      • 一. 定义
      • 二. 调用场景
      • 三. 其他特性


一. 定义

拷贝构造函数:如果一个类构造区数的第一个参数是所属的类类型的引用。如果后面还有其他额外参数,并且后面这些额外的参数还都有默认值,则这个构造函数就叫拷贝构造函数。

注意:拷贝构造函数默认参数必须放在函数声明中,除非该函数没有函数声明。

建议:

  1. 拷贝构造函数第一个参数总是带着const,作用参考前面的文章:传送门
  2. explicit:拷贝构造函数一般不要声明成explicit(禁止隐式转换),作用参考前面的文章:传送门
class Time
{
public:
	Time();
	int Hour;
	int Minute;
	int Second;
	
	//拷贝构造函数(在类对象赋值的时候,给对象一些值),
	Time(const Time &tmptime,int a = 5);
};

Time::Time():Hour(11), Minute(58), Second(49)
{
	std::cout << "调用了Time::Time()构造区数" << std::endl;
}

Time::Time(const Time &tmptime, int a):Hour(12),Minute(59), Second(50)
{
	std::cout << "调用了Time::Time(Time &taptime, int a)拷贝构造区数" << std::endl;
}

二. 调用场景

作用会在一定的时机(定义类对象的同时被赋值),被系统默认调用。

如:

int main()
{
	Time myTime;               //调用默认构造函数(不带参数)
	Time myTime2 = myTime;     //调用拷贝构造函数
	Time myTime3(myTime);      //调用拷贝构造函数
	Time myTime4{ myTime };    //调用拷贝构造函数
	Time myTime5 = { myTime }; //调用拷贝构造函数
	Time myTime6;              //调用默认构造函数(不带参数)
	myTime6 = myTime5;         //从运行结果来看,没有调用拷贝构造函数,后面在拓展,这里暂不考虑

    system("pause");
	return 0;
}

在这里插入图片描述

此外,还有其他调用拷贝构造函数的情景:

1、将一个对象作为实参传递给一个非引用类型的形参。

void func(Time tmptime)
{
	std::cout << "调用了Time::Time(Time &taptime, int a)拷贝构造区数" << std::endl;
}
int main()
{
	Time myTime;
	func(myTime);	
}

运行结果:

在这里插入图片描述

2、从一个函数中返回一个对象的时候。

Time func()
{
	Time tmpTime;
	return tmpTime;  //系统产生了临时对象并且调用了类的拷贝构造函数
}
int main()
{
	func();	 //等价于 Time myTime = func();
}

运行结果:

在这里插入图片描述

3、还有一些其他调用拷贝构造函数的情况以后补充。


三. 其他特性

我们前面说过,默认情况下,类对象的拷贝是每个成员变量的逐个拷贝。

成员变量逐个拷贝的功能因为定义的拷贝构造函数的存在而丢失了作用,或者说我们自己定义的拷贝构造函数取代了系统默认的每个成员变量逐个拷贝的这种行为。

a) 如果我们没有为类定义拷贝构造函数,编译器就会帮我们定义一个“合成拷贝构造函数”。

b) 编译器帮我们定义的“合成拷贝构造函数”一般也是将类对象tmptime的成员逐个拷贝到正在创建的对象中(Time myTime2 = myTime)。
每个成员的类型决定它如何拷贝:

  • 若是整型的,那么就直接把值拷贝过来赋值给正在创建的类对象;
  • 若是类类型的,那么就调用类类型的这个类的拷贝构造函数来拷贝赋值给正在创建的类对象(若自己定义了类A的拷贝构造函数,则不会调用在类A声明的类B的拷贝构造函数,只调用类B构造函数);

c) 如果自己定义了拷贝构造函数,那么系统就不会在定义“合成拷贝构造函数”,这时必须在自己定义的拷贝构造函数给类成员赋值,以免出现类成员没有被赋值就使用的情况发生。

假设我们在类成员函数中,对成员变量进行赋初值,而在拷贝构造函数中,不对成员变量进行赋初值。

Time::Time():Hour(11), Minute(58), Second(49)
{
	std::cout << "调用了Time::Time()构造区数" << std::endl;
}

Time::Time(const Time &tmptime, int a)
{
	std::cout << "调用了Time::Time(Time &taptime, int a)拷贝构造区数" << std::endl;
}

运行结果如下:所以必须在自己定义的拷贝构造函数给类成员赋值

```
![在这里插入图片描述](https://img-blog.csdnimg.cn/0a8d5202fa874c60835a94d4be3fd6d4.png)


态度"ABC"理论的三个维度,即情感(Affective)、行为(Behavioral)和认知(Cognitive)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

只有开源才能拯救AI

导语 | 随着 AI 技术的蓬勃发展&#xff0c;大模型的开源化正成为人工智能领域的新潮流&#xff0c;但同时引发的伦理和安全风险也饱受大家关注&#xff0c;如何把握平衡其中的尺度成为开源的一大难题。我们又应该如何有效进行开源治理&#xff1f;未来将走向何方&#xff1f;今…

1003:两个整数的四则运算

题目描述&#xff1a;输入两个整数num1和num2&#xff0c;请你设计一个程序&#xff0c;计算并输出它们的和、差、积、整数商及余数。 输入&#xff1a;输入只有两个正整数num1、num2。 输出&#xff1a;输出占一行&#xff0c;包括两个数的和、差、积、商及余数&#xff0c;数…

linux openlab搭建web网站

网站需求&#xff1a; 1.基于域名 www.openlab.com 可以访问网站内容为 welcome to openlab!!! 2.给该公司创建三个子界面分别显示学生信息&#xff0c;教学资料和缴费网站&#xff0c; 1、基于 www.openlab.com/student 网站访问学生信息&#xff0c; 2、基于 www.openlab…

个推「数据驱动运营增长」上海专场:携程智行火车票分享OTA行业的智能用户运营实践

近日&#xff0c;以“数据增能&#xff0c;高效提升用户运营价值”为主题的个推「数据驱动运营增长」城市巡回沙龙上海专场圆满举行。携程智行火车票用户运营负责人王银笛分享OTA行业的智能用户运营实践。 ▲ 王银笛 携程智行火车票用户运营负责人 负责智行业务线用户运营。从0…

【CANN】SPI通信、I2C通信

文章目录 一、SPI通信1.SPI通信2.SPI通信原理3.CPOL时钟极性、CPHA时钟相位 二、I2C通信1、I2C通信2、I2C通信原理2.1、I2C的起始和结束条件2.2、数据传送格式 总结 一、SPI通信 1.SPI通信 SPI是英语Serial Peripheral interface的缩写&#xff0c;顾名思义就是串行外围设备接…

PLM/ERP/APS/MES/SRM/CRM/WMS/QMS

参考一 ERP 1 什么是ERP ERP的英文全称是“Enterprise Resource Planning”&#xff0c;从字面上看&#xff0c;它的意思就是“企业资源计划”。ERP最开始是由美国著名的计算机技术咨询和评估集团Garter Group提出的一整套企业管理系统体系标准。 2 ERP的发展历程&#xff08…

javaEE进阶

Cookie 是可以伪造的,比如说学生证是可以伪造的 Session 是不可以伪造的,这是学校系统记录在册的 如何获取 Cookie 我们先用 Servlet 原生的获取 cookie 的方式 我们在浏览器进行访问 但是实际上目前是没有 cookie 的,我们按 F12 进行添加 然后再重新访问,就能在 idea 看到 …

冒泡排序算法原理和代码实现,就是这么简单!

冒泡排序&#xff0c;是比较简单的一种排序算法。 它的命名源于它的算法原理&#xff1a;重复的从前往后&#xff08;或者从后往前&#xff09;&#xff0c;依次比较记录中相邻的两个元素&#xff0c;如果他们顺序错误就把它们交换过来&#xff0c;直到没有再需要交换的元素&am…

虚拟人高清视频渲染宝藏工具:RenderHare飞兔渲染软件

在数字时代&#xff0c;品牌为了抢占年轻人群体&#xff0c;纷纷涌入虚拟人IP赛道&#xff0c;通过虚拟人IP运营模式&#xff0c;构建独特的虚拟人IP记忆符号&#xff0c;向粉丝输出品牌潮流、年轻化的价值观&#xff0c;扩散虚拟IP影响力&#xff0c;让品牌真正与消费者玩在一…

基于注解的声明式事务

1.什么是事务 数据库事务(transaction)是访问并可能操作各种数据项的一个数据库操作序列&#xff0c;这些操作要么全部执行要么全部不执行&#xff0c;是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。 2.事务的特性 A&#xff1a;原子性(A…

国际阿里云:提高CDN缓存命中率教程!!!

CDN缓存命中率低会导致源站压力大&#xff0c;静态资源访问效率低。您可以根据导致CDN缓存命中率低的具体原因&#xff0c;选择对应的优化策略来提高CDN的缓存命中率。 背景信息 CDN通过将静态资源缓存在CDN节点上实现资源访问加速。当客户端访问某资源时&#xff0c;如果CDN节…

腾讯待办停运后怎么办呢?导出的ics文件怎么打开查看

待办类工具在日常工作中的应用是比较广泛的&#xff0c;很多人会选择使用待办软件记录备忘事项&#xff0c;其中一些提醒类的工具是比较广泛使用的。腾讯待办属于一款待办事项和日程管理工具&#xff0c;它通常是以微信小程序的形式&#xff0c;为大家提供时间管理规划&#xf…

应急响应练习2

目录 1. 请提交攻击者的ip与系统版本 2. 攻击者通过某个组件漏洞获得服务器权限&#xff0c;请提交该组件的名称 3. 请提交攻击者首次攻击成功的时间 4. 请提交攻击者上传的webshell文件绝对路径 5. 请提交攻击者使用的webshell管理工具 6. 攻击者进一步留下的免杀的webs…

AGV与AMR的区别

如今&#xff0c;市面上最受关注的两类工业移动机器人分别是AGV和AMR。但大众对于两者的区别还是不甚了解&#xff0c;因此小编将通过这篇文章为大家详细解释。 一、概念阐述 【AGV 】 AGV (Automated Guided Vehicle) 即自动导引运输车&#xff0c;可指基于各种定位导航技术…

2023数据结构期中测验-2023秋-计算机+未来网络专业

数据结构期中测验 选择题函数题6-1 求链式表的表长6-2 逆序数据建立链表6-3 删除单链表偶数节点6-4 求二叉树高度6-5 先序输出叶结点 为了防止不自觉的朝答案看去&#xff0c;特意用了明黄色字体&#xff0c;如下查看答案&#xff1a; 选择题 2-1 下述程序段的时间复杂度为&am…

独立站商品信息是怎么获取的呢

独立站商品信息的获取主要通过以下几种方式&#xff1a; 人工收集&#xff1a;卖家可以通过在各个电商平台、网站等渠道进行手动搜索和收集商品信息&#xff0c;包括商品名称、价格、描述、图片等&#xff0c;然后将其导入到自己的独立站中。使用采集工具&#xff1a;目前市面…

暖手宝上架亚马逊美国站UL499报告测试标准要求

暖手宝是运用物理及化学原理研制的自动取暖保健用品。该产品以其自动生热&#xff0c;有趣&#xff0c;实用等新颖独特的优势&#xff0c;深受欢迎——暖手宝具有自动取暖&#xff0c;理疗保健等多种功能。只要插上电源等上10分钟左右就能发热&#xff0c;最后一种是通过锂电池…

arcgis--消除坐标系信息的两种方法

方法一&#xff1a;在【目录】中右击待修改数据&#xff0c;选择【属性】&#xff0c;选择【XY坐标】选项卡&#xff0c;点击清楚按钮。 方法二&#xff1a;在【数据管理工具】-【投影与变换】-【定义投影】中清楚坐标系信息。如下&#xff1a;

如何用Python实现图像拼接画(把一堆小图拼成大图)

诸神缄默不语-个人CSDN博文目录 在这里的图像拼接画指的是一张大图由很多小图组成&#xff0c;效果就像这样&#xff1a; 原理&#xff1a;将大图拆成很多小块&#xff0c;每一块计算平均颜色&#xff0c;用平均颜色最相近的小图来替代&#xff0c;就可以。 直接遍历就可以&…

FFmpeg开发简介1

适逢FFmpeg6.1发布&#xff0c;准备深入学习下FFmpeg&#xff0c;将会写下系列学习记录。 在此列出主要学习资料&#xff0c;后续再不列&#xff0c;感谢这些大神的探路和分享&#xff0c;特别是雷神&#xff0c;致敬&#xff01; 《FFmpeg从入门到精通》 《深入理解FFmpeg》 …