拷贝构造函数:对象复制的重要工具

拷贝构造函数

功能:
使用一个已经存在的对象来初始化一个新的同一类型的对象。
声明:
只有一个参数并且参数为该类对象的引用
如果类中没有说明拷贝构造函数,则系统会自动生成一个缺省复制构造函数,作为该类的公有成员。

当函数的形参是类的对象,调用函数时,进行形参与实参结合时便用。
这时要在内存新建立一个局部对象,并把实参拷贝到新的对象中。理所当然也调用拷贝构造函数。

  1 #include"copy.h"2 /*void function(const person& p)3 {4     cout<<"constructor"<<endl;5 }*/6 void function2(const person p)7 {8     cout<<"constructor"<<endl;9 }10 11 int main()12 {13     person p(10,20);14     person pp(p);15     person ppp = pp;16 17     function2(p);18     return 0;19 }

结果:

[bsk@localhost structor]$ ./a.out 
person constructor //p的默认构造调用
copy function10  //pp的拷贝构造调用
copy function10 //ppp的拷贝构造调用
copy function10 //function函数拷贝构造
constructor

那如果函数参数时以引用的方式,会不会调用拷贝构造函数呢?

  1 #include"copy.h"2 void function(const person& p)3 {4     cout<<"constructor"<<endl;5 }6 int main()7 {8     person p(10,20);9     person pp(p);10     person ppp = pp;11 12     function(p);13     return 0;14 }

结果如下:

[bsk@localhost structor]$ ./a.out 
person constructor //p的默认构造调用
copy function10  //pp的拷贝构造调用
copy function10 //ppp的拷贝构造调用
constructor   //function函数调用

当函数的返回值是类对象,函数执行完成返回调用者时使用。理由也是要建立一个临时对象中,再返回调用者。

#include"copy.h"person function3(const person& p)
{return p;
}int main()
{person p(10,20);function3(p);return 0;
}

结果:

[bsk@localhost structor]$ ./a.out 
person constructor  //p的默认构造
copy function10   //function 在返回类对象时调用的拷贝构造

为什么不直接用要返回的局部对象呢?因为局部对象在离开建立它的函数时就消亡了,不可能在返回调用函数后维续生存,所以在处理这种情况时,编译系统会在调用函数的表达式中创建一个无名临时对象,该临时对象的生存周期只在函数调用处的表达式中。如果用一个新变量来接收临时对象,
临时对象变成有名对象,则此对象就不会马上销毁

所谐return对象,实际上是调用拷贝构造函数把该对象的值拷入临时对象。如果返回的是变量,处理过程类似,只是不调用构造函数

#include"copy.h"const person& function3(const person& p)
{return p;
}int main()
{person p(10,20);person  pp = function3(p);const person & ppp= function(p);//因为引用,共用一块内存空间,不会调用拷贝构造函数return 0;
}

结果:

[bsk@localhost structor]$ ./a.out 
person constructor  //p的默认构造
copy function10   //  pp = function3(p);拷贝构造

深浅拷贝

深拷贝指的是在进行对象复制时,不仅复制了对象本身,还复制了对象所引用的其他对象,以确保复制后的对象与原始对象完全独立,彼此之间不会相互影响。换句话说,深拷贝会递归地复制对象及其所有引用的对象,从而创建一份全新的、独立的副本。

举个例子,假设有一个包含其他对象引用的复杂对象A,通过深拷贝后得到的副本B将会包含与A中相同类型和值的所有对象,而不是简单地复制它们的引用。这意味着对副本B的任何修改都不会影响原始对象A,因为它们引用的是完全独立的对象。

在编程中,实现深拷贝通常需要递归遍历对象结构,并对其中的每个对象进行复制。对于复杂的数据结构,如嵌套的列表、字典或自定义对象,确保进行深拷贝尤为重要。

深拷贝能够确保对象复制的完整性和独立性,但也需要额外的系统资源来完成复制操作。因此,在进行对象复制时,需要权衡资源消耗和需求,选择适合的复制方式。

#include<iostream>
using namespace std;
class person
{
public:person(){cout << "person()的默认构造" << endl;}person(int age,int hight){myage = age;myheight =new int( hight);cout << "person()的有参函数构造" << endl;}//shenkaobeiperson(const person& p){myage = p.myage;//myheight = p.myheight;编译器默认(浅拷贝)提供的//因为是指针地址,会导致两个名释放同一块内存空间//深拷贝myheight = new int(*p.myheight);}~person(){//析构函数将,堆区 ,开辟的数据进行释放if (myheight != NULL){delete myheight;myheight = NULL;}cout << "person()的析构函数构造" << endl;}int myage;int* myheight;
};
void test01()
{person p1(10,120);person p2(p1);cout << p2.myage<<endl <<*p2.myheight<< endl;return;
}
int main()
{test01();system("pause");return 0;
}

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

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

相关文章

ospf选路

问题描述 R6通过主备份路径访问LSP&#xff08;R1&#xff09;&#xff0c;主为R2&#xff0c; 备为R3 解决方案 路由器1看作LSP&#xff0c;配置loopback 0 ,地址为1.1.1.1 供测试使用&#xff1b;路由器 236, LSW4和LSW5&#xff0c; 运行ospf处于相同区域&#xff0c;建立…

<JavaEE> 经典设计模式之 -- 定时器

目录 一、定时器的概念 二、Java 标准库中的定时器 三、实现自己的定时器 一、定时器的概念 什么是定时器&#xff1f;定时器是软件开发中的一个常用且重要组件&#xff0c;作用是在达到设定时间后&#xff0c;执行指定的代码。 二、Java 标准库中的定时器 1&#xff09;T…

Redis核心知识点总结

1.Redis介绍 Redis 是 NoSQL&#xff0c;但是可处理 1 秒 10w 的并发&#xff08;数据都在内存中&#xff09; 使用 java 对 redis 进行操作类似 jdbc 接口标准对 mysql&#xff0c;有各类实现他的实现类&#xff0c;我们常用的是 druid 其中对 redis&#xff0c;我们通常用 J…

C语言 if语句有无(;)分号问题

在C语言中&#xff0c;if语句后面不带分号&#xff08;;&#xff09;的情况有两种主要形式&#xff1a; 1. 带有大括号的代码块&#xff1a;如果if语句后面跟随一个由大括号&#xff08;{}&#xff09;包围的代码块&#xff0c;那么这个代码块中的语句只有在if条件为真时才会执…

【C语言】7-38 吉老师的回归 分数 15

7-38 吉老师的回归 分数 15 全屏浏览题目 切换布局 作者 DAI, Longao 单位 杭州百腾教育科技有限公司 曾经在天梯赛大杀四方的吉老师决定回归天梯赛赛场啦&#xff01; 为了简化题目&#xff0c;我们不妨假设天梯赛的每道题目可以用一个不超过 500 的、只包括可打印符号的…

分类与群组:解析分类和聚类分析技术

目录 写在开头1. 数据分类与聚类简介1.1 分类分析1.2 聚类分析1.3 对比分析2. 如何学习分类和聚类分析技术2.1 学习理论知识2.1.1 数学知识2.1.2 编程基础2.1.3 深入学习算法2.1.3.1 分类算法学习举例2.1.3.2 聚类算法学习举例2.1.4 参与实战2.2 应用成功案例2.2.1 分类算法成功…

16、XSS——会话管理

文章目录 一、web会话管理概述1.1 会话管理1.2 为什么需要会话管理&#xff1f;1.3 常见的web应用会话管理的方式 二、会话管理方式2.1 基于server端的session的管理方式2.2 cookie-based的管理方式2.3 token-based的管理方式 三、安全问题 一、web会话管理概述 1.1 会话管理 …

加速度jsudo:IC商城系统4.0版正式发布 PCB计价电子元器件商城

近日&#xff0c;在加速度软件新品会发布会上&#xff0c;Mike正式公布了其4.0版本的电子元器件商城系统&#xff0c;展示了迭代后的强大新功能。在招募了数十家元器件销售、运营和老板测试体验后&#xff0c;获得了大家一致的好评。其中&#xff0c;中国电子南京某子公司董事长…

VMware虚拟机系统CentOS镜像的下载

文章目录 阿里云下载官网下载参考文档 一些小版本可能过时或者其他原因已经不能存在了&#xff0c;只有大版本号最新的&#xff0c;或者其他最新版本 阿里云下载 1-百度搜索&#xff1a;阿里云 2-找到开发者社区 3-找到下载&#xff0c;选择镜像 4-选择系统 5-点击镜像地…

vivado时序方法检查3

TIMING-7 &#xff1a; 相关时钟间无公共节点 时钟 <clock_name> 与 <clock_name> 之间相互关联 &#xff08; 一起定时 &#xff09;&#xff0c; 但两者间无公共节点。此设置在硬件中可能失败。要查找这些时钟之间的时序路径&#xff0c; 请运行以下命令 &a…

javascript 访问器属性创建的三种方式

出自 javascript高级程序设计-第六章6.1节 javascript 访问器属性创建的三种方式&#xff1a; 以下year字段都是访问器属性&#xff0c;_year、 edition是数据属性。 var book1 { _year: 2000, edition: 1 }; Object.defineProperty(book1, "year", { get: fun…

岚图追光PHEV 25.28万元起售,开卷混动豪华轿车

作者&#xff5c;Amy 编辑&#xff5c;德新 12月5日晚&#xff0c;2023岚图科技日上&#xff0c;岚图汽车正式发布了其新一代SOA电子电气架构天元架构&#xff0c;并宣布了以“新行政电动旗舰”为定位的岚图追光PHEV正式上市。 岚图追光PHEV是岚图汽车旗下首款电混轿车&#x…

selenium自动化测试:xpath八种定位方式!

01、前言 如果可以的话&#xff0c;请先关注&#xff08;专栏和账号&#xff09;&#xff0c;然后点赞和收藏&#xff0c;最后学习和进步。你的支持是我继续写下去的最大动力&#xff0c;个人定当倾囊而送&#xff0c;不负众望。谢谢&#xff01;&#xff01;&#xff01; 1.…

【springboot】整合redis和定制化

1.前提条件:docker安装好了redis,确定redis可以访问 可选软件: 2.测试代码 (1)redis依赖 org.springframework.boot spring-boot-starter-data-redis (2)配置redis &#xff08;3&#xff09; 注入 Resource StringRedisTemplate stringRedisTemplate; 这里如果用Autowi…

一台服务器能放多少个网站?

这个问题有点意思&#xff0c;确实是有不少用户会问到&#xff0c;但其实这个问题的真正意思是&#xff0c;一台服务器上面放多少个网站不卡&#xff0c;打开不慢 。其实这个问题又有点复杂&#xff0c;一台服务器放多少个网站不会卡&#xff0c;跟很多因素有关&#xff0c;比如…

docker安装及简单使用(Linux版本)

文章目录 前言一、docker安装二、docker命令pull&#xff08;安装镜像&#xff09;images&#xff08;查看镜像&#xff09;run&#xff08;创建容器&#xff09;删除容器exec&#xff08;进入运行中的容器&#xff09;常用命令 总结如有启发&#xff0c;可点赞收藏哟~ 前言 ht…

Python 进阶(十三):JSON 序列化和反序列化(json 模块)

大家好&#xff0c;我是水滴~~ 本篇文章主要介绍json模块的功能&#xff0c;包括将Python对象序列化到文件、将Python对象序列化为字符串、序列化时类型的对照表、将文件中JSON数据反序列化为Python对象&#xff0c;将JSON字符串反序列化为Python对象、反序列化时类型的对照表…

Python 模块的使用方法

Python 模块是一种组织和封装代码的方式&#xff0c;允许你将相关的功能和变量放在一个单独的文件中&#xff0c;以便在其他程序中重复使用。在Python中&#xff0c;模块是一种可执行的Python脚本&#xff0c;其文件扩展名为 .py。这里&#xff0c;我将详细讲解Python模块的使用…

2023中医药国际传承传播大会在深圳召开

12月2日&#xff0c;2023中医药国际传承传播大会在深圳召开&#xff0c;大会由世界针灸学会联合会、中新社国际传播集团、中国新闻图片网、中国民族医药学会、中国针灸学会主办&#xff0c;世界针灸学会联合会健康传播工作委员会、中新雅视文化发展有限公司公司与深圳巨邦传媒集…

播放pcap抓包文件中的amr-wb、amr-nb、evs声音

前言 由于wireshark并不能解析amr-wb、evs数据&#xff0c;所以也就没办法播放响应的音频。在遇到问题时&#xff0c;想还原抓包的数据是否正常就很难受。为了解决这个问题&#xff0c;我看了RFC4867&#xff0c;想着自己写一个解包小工具&#xff0c;最后彻底放弃。。感觉太复…