C++对象的浅复制和深复制详解及简单实例
C++对象的浅复制和深复制详解及简单实例
浅复制:两个对象复制完成后共享某些资源(内存),其中一个对象的销毁会影响另一个对象
深复制:两个对象复制完成后不会共享任何资源,其中一个对象的销毁不会影响另一个对象
下面我们来看一段代码,以便直观的理解:
#include<iostream> #include<string.h> using namespace std; class Student { int no; char *pname; public: Student(); Student(int n,char* p); ~Student(); void display(); }; Student::Student(){} Student::Student(int n,char* p) { no=n; pname=new char[10]; strcpy(pname,p); } Student::~Student() { delete []pname; } void Student::display() { cout<<"学号:"<<no<<",姓名:"<<pname<<endl; } void main() { Student s(10,"xiaoming"),t; t=s; cout<<"s="; s.display(); cout<<"t="; t.display(); }
这段程序看上去是正确的,但是执行就会出错,原因就是复制语句t=s,此语句执行的复制是浅复制,s将pname指针指向的地址赋给s的pname,它们就会指向相同的内存空间,当t被析构时,t.pname所指的内存空间就被释放了,再执行s的析构函数就会出错。
如果采用深复制就可以避免这个问题,下面我们用运算符重载函数实现深复制:
Student& Student::operator = (Student& s) { no=s.no; int len=strlen(s.pname); pname=new char[len+1]; strcpy(pname,s.pname); return *this; }
在执行t=s时,运算符重载函数内已为t分配内存空间。
对于上述运算符重载函数有两点说明:
1.形参一定要是引用类型,否则执行t=s时,就要先将实参s复制到形参s,这个过程是浅复制,没有为形参s分配内存空间,运行会出错;
2.返回值一定要是引用类型,因为执行t=s相当于执行t.=(s),若返回值不是引用类型,那么还要将函数的返回对象复制到t,又会出错
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
您可能感兴趣的文章
- 04-02c语言的正则匹配函数 c语言正则表达式函数库
- 04-02c语言中对数函数的表达式 c语言中对数怎么表达
- 04-02c语言没有round函数 round c语言
- 04-02C语言中怎么打出三角函数 c语言中怎么打出三角函数的值
- 01-10c语言求1+2+...+n的解决方法
- 01-10求子数组最大和的解决方法详解
- 01-10深入理解约瑟夫环的数学优化方法
- 01-10深入二叉树两个结点的最低共同父结点的详解
- 01-10数据结构课程设计- 解析最少换车次数的问题详解
- 01-10c语言 跳台阶问题的解决方法
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 01-10C#中split用法实例总结
- 01-11ajax实现页面的局部加载
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 01-10SublimeText编译C开发环境设置
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 04-02jquery与jsp,用jquery
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-10delphi制作wav文件的方法
- 08-05dedecms(织梦)副栏目数量限制代码修改