C++细讲深浅拷贝与初始化列表如何操作_第1页
C++细讲深浅拷贝与初始化列表如何操作_第2页
C++细讲深浅拷贝与初始化列表如何操作_第3页
C++细讲深浅拷贝与初始化列表如何操作_第4页
C++细讲深浅拷贝与初始化列表如何操作_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论