10、深拷贝与浅拷贝

浅拷贝: 实现对象间数据元素的一一对应赋值;(默认构造函数)

深拷贝: 当被复制的对象数据成员是指针类型时,不是复制该指针成员本身,而是将指针所指的对象进行复制。

//浅拷贝

#include<iostream>

using namespace std;

class Point

{ public:

       Point()

      {   X=Y=0;     cout<<"Default Constructor called."<<endl;     }

       Point(int xx,int yy)

      {   X=xx;     Y=yy;     cout<< "Constructor called."<<endl;     }

       ~Point()

      {   cout<<"Destructor called."<<endl;    }

       int GetX() {return X;}

       int GetY() {return Y;}

          void Move(int x,int y)

                   {  X=x;  Y=y;   }

  private:

       int  X,Y;

};

class ArrayOfPoints

{

   public:

     ArrayOfPoints(int n)

     {   numberOfPoints=n;  points=new Point[n];  }

     ~ArrayOfPoints()

     {   cout<<"Deleting..."<<endl;

         numberOfPoints=0;  delete[] points;    

       }

     Point& Element(int n)

     {  return points[n];  }

   private:

     Point *points;

     int numberOfPoints;

};

int main()

{

         int number;

         cout<<"Please enter the number of points:";

         cin>>number;

     ArrayOfPoints pointsArray1(number);    //创建对象数组

     pointsArray1.Element(0).Move(5,10);     //通过指针访问数组元素的成员

     pointsArray1.Element(1).Move(15,20);   //通过指针访问数组元素的成员

     ArrayOfPoints pointsArray2(pointsArray1); //创建对象数组副本

     cout<<"Copy of pointsArray1:"<<endl;

     cout<<"Point_0 of array2: "

         <<pointsArray2.Element(0).GetX()

         <<", "<<pointsArray2.Element(0).GetY()<<endl;

     cout<<"Point_1 of array2: "

         <<pointsArray2.Element(1).GetX()

         <<", "<<pointsArray2.Element(1).GetY()<<endl;

     pointsArray1.Element(0).Move(25,30);     //通过指针访问数组元素的成员

     pointsArray1.Element(1).Move(35,40);   //通过指针访问数组元素的成员

     cout<<"After the moving of pointsArray1:"<<endl;

     cout<<"Point_0 of array2: "

         <<pointsArray2.Element(0).GetX()

         <<", "<<pointsArray2.Element(0).GetY()<<endl;

     cout<<"Point_1 of array2: "

         <<pointsArray2.Element(1).GetX()

         <<", "<<pointsArray2.Element(1).GetY()<<endl;

} //运行结果如下:

Please enter the number of points:2

Default Constructor called.

Default Constructor called.

Copy of pointsArray1:

Point_0 of array2: 5, 10

Point_1 of array2: 15, 20

After the moving of pointsArray1:

Point_0 of array2: 25, 30

Point_1 of array2: 35, 40

Deleting...

Destructor called.

Destructor called.

Deleting...

接下来程序出现异常,也就是运行错误。出现在删除数组2的时候出错,错误原因如图:浅拷贝完成之后,两个对象指向内存的同一个地址,因此改变数组1的时候2也被改变,当释放对象内存的时候,释放1之后,2也被释放完成了,当再次释放2的时候,编译器就报错了。

最新文章

  1. 【转载】Unity中矩阵的平移、旋转、缩放
  2. web前端交互性易用性说明
  3. asp.net signalR 专题—— 第一篇 你需要好好掌握的实时通讯利器
  4. HDU 3336 Count the string(KMP的Next数组应用+DP)
  5. Java-马士兵设计模式学习笔记-观察者模式-OOD 封装event
  6. (转)Asp.Net 请求处理机制
  7. 在线支付接口之PHP支付宝接口开发简单介绍
  8. Hadoop学习之Hadoop集群搭建
  9. SQL点滴13—收集SQLServer线程等待信息
  10. vim基础详解
  11. 个人从源码理解JIT模式下angular编译AppModule的过程
  12. 计算机基础理论知识梳理篇(三):VLAN与VLAN网卡相关概念
  13. input 光标在 chrome下不兼容 解决方案
  14. HDU - 2147 kiki's game 巴什博弈
  15. 消息中间件kafka+zookeeper集群部署、测试与应用
  16. el-date-picker 快捷日期简单计算
  17. QLayout: Attempting to add QLayout XXX to XXX, which already has a layout
  18. 微信小程序 windos server 2008 iis 7 tls1.0 升级 tls1.2
  19. java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletRequest
  20. SFTP文件上传与下载(window 上传文件到linux服务器)

热门文章

  1. JS事件流、DOM事件流、IE事件处理、跨浏览器事件处理、事件对象与类型
  2. Treap总结
  3. 一次线上nohup.out日志丢失的问题
  4. go 环境及4开发
  5. docker常见操作总结
  6. 【python基础语法】第3天作业练习题
  7. cf1041E
  8. 【终端使用】&quot;scp&quot;命令,远程拷贝文件
  9. 电脑和手机上常用apk或Pc软件的重要目录或文件或文件夹路径
  10. jquery-进度条