欢迎来到代码驿站!

C代码

当前位置:首页 > 软件编程 > C代码

C++对象的浅复制和深复制详解及简单实例

时间:2021-06-10 08:23:01|栏目: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,又会出错

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

上一篇:C语言/C++中如何产生随机数

栏    目:C代码

下一篇:C语言中指针 int *p=0;和int *p;*p=0;和”&“的关系和区别详解

本文标题:C++对象的浅复制和深复制详解及简单实例

本文地址:http://www.codeinn.net/misctech/138992.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有