下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第C++细讲深浅拷贝与初始化列表如何操作目录深浅拷贝区别代码解释特别注意内存图解释初始化列表语法具体实现总结
深浅拷贝区别
上一节简单提了编译器会默认给我们提供值拷贝构造函数,结果是新的对象会拥有和传入对象一样的属性,由编译器提供的拷贝构造被称为浅拷贝构造,而由我们自己编写的不同于编译器提供的拷贝构造函数就叫深拷贝构造了,举个典型的例子说明。
代码解释
#includeiostream
usingnamespacestd;
//深浅拷贝问题,存在经典的坑,面试考过
classPerson
public:
Person(intage,intheight)
m_age=age;
m_Height=newint(height);
cout"Person的有参构造函数调用"endl;
//自己写不同于编译器的拷贝构造函数属于深拷贝
Person(constPersonp)
cout"拷贝构造函数调用"endl;
m_age=p.m_age;
//m_Height=p.m_Height;
/*编译器默认执行上行代码
新开辟的地址相同,会导致调用析构函数时违法操作,无法访问内存*/
m_Height=newint(*p.m_Height);
~Person()
//析构代码,将堆区开辟的数据做释放操作
if(m_Height!=NULL)
deletem_Height;
m_Height=NULL;
cout"~Person的析构构造函数调用"endl;
intm_age;
int*m_Height;
voidtest()
Personp1(20,180);
Personp2(p1);
cout"p2.age="p2.m_age"p2.height="*p2.m_Heightendl;
intmain()
test();
system("pause");
}
创建Person类,设置m_age和指针类型*m_Height为私有属性;依次对Person类设置有参构造和拷贝构造函数以及析构函数;前面析构函数一直没有什么作用,其实它是用来清理对象的,析构函数会在程序结束前自动调用,这时候就可以使用delete清理掉;
特别注意
Person(constPersonp)
cout"拷贝构造函数调用"endl;
m_age=p.m_age;
//m_Height=p.m_Height;
/*编译器默认执行上行代码
新开辟的地址相同,会导致调用析构函数时违法操作,无法访问内存*/
m_Height=newint(*p.m_Height);
~Person()
//析构代码,将堆区开辟的数据做释放操作
if(m_Height!=NULL)
deletem_Height;
m_Height=NULL;
cout"~Person的析构构造函数调用"endl;
}
这里不能使用编译器提供的浅拷贝,如果直接使用m_Height=p.m_Height,毫无疑问这两个属性地址相同,那么在调用析构函数的时候,p1先释放内存,这时候虽然有一个NULL判断,但是此块内存已经被删除,再次访问都会提示错误,这是很危险的,所以我们需要用深拷贝解决重复删除的问题。使用m_Height=newint(*p.m_Height)语句给身高属性重新开辟空间,这样在调用析构的时候各自清理各自的属性,就解决了这个浅拷贝带来的重复清理问题。
内存图解释
上面是浅拷贝的p1、p2对象的内存示意图,两次析构会重复当问0x00011地址,但是当这个地址被删除后,是不允许再次访问的。
利用我们设置的深拷贝构造后,地址不一样,各自删除各自的地址,解决问题
初始化列表
初始化列表用来给属性初始化
语法
普通构造函数+:+类属性(变量或常量)+{}
具体实现
classPerson
public:
Person():m_age(20),m_sex(1),m_height(180){}
Person(inta,intb,intc):m_age(a),m_sex(b),m_height(c){}
intm_age;
intm_sex;
intm_height;
intmain()
Personp1;
Personp2(10,20,30);
cout"年龄为:"p1.m_age;
cout"性别为:"p1.m_sex;
cout"身高为:"p1.m_heightendl;
cout"年龄为:"p2.m_age;
cout"性别为:"p2.m_sex;
cout"身高为:"p2.m_heightendl;;
}
主函数中p1调用无参构造函数,各属性初始化为属性()括号里面的值;p2调用有参构造函数,将实参10,20,30分别传给a,b,c,然后a的值传给m_age,b的值传给m_sex;c的值传给m_height;直
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GA/T 2343-2025法庭科学电子数据保全文件技术要求
- 第六章 数字化营销渠道构建
- 2026年法律投资API 对接合同
- 2026年交通合作加盟合作合同
- 村屯清洁工作制度汇编
- 预检分诊导医工作制度
- 领导干部下派工作制度
- 食品厂检验室工作制度
- 麻城零工驿站工作制度
- 陇南地区两当县2025-2026学年第二学期五年级语文第八单元测试卷(部编版含答案)
- 发电厂设备预防性试验作业指导书
- 国开2026年《公共政策概论》形成性考核任务1-4答案
- 红十字站工作制度
- 工厂6S管理培训资料
- 2025年4月自考00744美术鉴赏试题
- 2025年全国统一高考语文试卷(全国二卷)含答案
- 《帕金森病的认知功能障碍》课件
- 前列腺癌诊疗指南2022年版
- 中国生物科技成果转化蓝皮书-2024
- 烟草职业鉴定三级技能考点
- DB14-T 1734-2025 锅炉用甲醇燃料储供设施技术条件
评论
0/150
提交评论