在介绍C++浅拷贝与深拷贝之前,我们先引出C++的拷贝构造函数。

  C++拷贝构造函数是一种特殊的构造函数,其形参是本类对象的引用。用于在建立一个新的对象时,使用一个已经存在的对象来初始化这个新对象。因为拷贝构造函数时特殊的构造函数,所以其没有返回值类型,且名称与类名相同;该函数只有一个参数,即此类对象的引用;所有类都必须有一个拷贝构造函数,如果没有自动以拷贝构造函数,系统会自动产生一个默认拷贝构造函数。

  自定义拷贝构造函数的一般形式为:

    类名::类名(const 类名& 对象名)

        {

          函数体;

        }

  浅拷贝:在进行初始化的过程中仅进行简单的数据成员赋值。

  例如:

    class A{

      private:

        int a;

      public:

        A(int ta):a(ta){}

    };

  有如下代码:

    A a(5);

    A b(a);

  程序执行b(a)时,执行操作:b.a=a.a;与系统自动产生的拷贝构造函数:

    A::A(const A& t){this->a=t.a;}

  执行相同内容。完整代码如下:

      

  执行结果为:

    

  从结果中我们发现,我们通过对象a初始化的对象b中,数据元素与a中完全相等,甚至指针指向的地址都相同。不难看出,在a初始化b过程中只是进行了简单的值传递,并没有为b中的p申请新的堆内存空间。即两个对象的指针指向同一个地址,这也就意味着此地址将被释放两次,显然是不可取的。这一点由输出结果中b中*p的值异常便可看出。为了解决此问题,我们需要深拷贝。

  深拷贝:当类中有指针类型元素,需要申请堆内存空间时,为新的指针分配新的内存空间。(不可进行简单的值传递)

  这时,需要我们自定义拷贝构造函数:

    

  此时,重新编译运行程序,结果为:

    

  此时,虽然对象a已被删除,对象a仍输出正常,这是因为在自定义的深拷贝函数中,为新的对象申请了新的空间,而不是令其指向a中p指针变量指向的地址。

  总结:

    当类中无需申请动态资源时,浅拷贝构造函数可以很好的工作。当需要申请动态内存时,即类中有指针变量,则需要自定义深度拷贝函数。

  表述不当之处,还望各路大神指正。

      

C++拷贝构造函数:浅拷贝与深拷贝的更多相关文章

  1. 一文搞懂Java引用拷贝、浅拷贝、深拷贝

    微信搜一搜 「bigsai」 专注于Java和数据结构与算法的铁铁 文章收录在github/bigsai-algorithm 在开发.刷题.面试中,我们可能会遇到将一个对象的属性赋值到另一个对象的情况 ...

  2. ObjectiveC中的赋值,对象拷贝,浅拷贝与深拷贝

    在开发过程中我们经常会遇到对象拷贝的问题,下面我们分别讨论赋值操作.对象拷贝.以及浅拷贝(Shallow copy)与深拷贝(Deep copy)的区别与各自的实现方式. 一.不同对象的赋值操作 Ob ...

  3. C++雾中风景6:拷贝构造函数与赋值函数

    在进行C++类编写的过程之中,通常会涉及到类的拷贝构造函数与类的赋值函数.初涉类编写的代码,对于两类函数的用法一直是挺让人困惑的内容.这篇文章我们会详细来梳理拷贝构造函数与赋值函数的区别. 1.调用了 ...

  4. C++ 浅拷贝与深拷贝探究

    C++浅拷贝与深拷贝探究 浅拷贝与深拷贝的概念是在类的复制/拷贝构造函数中出现的. 拷贝构造函数使用场景 对象作为参数,以值传递方式传入函数(要调用拷贝构造函数将实参拷贝给函数栈中的形参) 对象作为返 ...

  5. C++中构造函数,拷贝构造函数和赋值函数的区别和实现

    C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法.下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个类的对象 ...

  6. C++中拷贝构造函数

    C++中拷贝构造函数 1.什么是拷贝构造函数: 拷贝构造函数嘛,当然就是拷贝和构造了.(其实很多名字,只要静下心来想一想,就真的是顾名思义呀)拷贝又称复制,因此拷贝构造函数又称复制构造函数.百度百科上 ...

  7. c#中浅拷贝和深拷贝的理解

    c#中拷贝有浅拷贝和深拷贝之分. 例如对象A,其中有值类型字段和引用类型字段: 1.浅拷贝: 对于值类型字段,直接逐位复制到新拷贝的副本对象中,修改副本的字段的值,不会影响源对象中字段的值: 对于引用 ...

  8. IOS的浅拷贝和深拷贝

    什么是深拷贝和浅拷贝 浅拷贝:就是指针的复制,拷贝的指针跟原指针指向内存中的同一个位置的对象.至于对象的引用计数值是否+1,就是看拷贝的指针赋给给的变量是Strong类型的,还是week类型的. 如果 ...

  9. 编写高质量代码改善C#程序的157个建议[为类型输出格式化字符串、实现浅拷贝和深拷贝、用dynamic来优化反射]

    前言 本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html .本文主要学习记录以下内容: 建议13.为类型输出格式化字符串 建议14.正确实现浅拷贝和深 ...

  10. 我的Python学习笔记(二):浅拷贝和深拷贝

    在Python中,对象赋值,拷贝(浅拷贝和深拷贝)之间是有差异的,我们通过下列代码来介绍其区别 一.对象赋值 对象赋值不会复制对象,它只会复制一个对象引用,不会开辟新的内存空间 如下例所示,将test ...

随机推荐

  1. 实现同时将一批.bmp文件转换成.mat格式

    %% 功能:实现同时对一批.bmp文件的转换成.mat格式PicFormat = {'*.bmp','Bitmap image (*.bmp)';... '*.jpg','JPEG image (*. ...

  2. 谷歌protocolbuff使用说明步骤

    Protocolbuff 目录 1       Protocolbuff定义和作用... 1 2       Protocolbuff的使用步骤... 1 3       .proto编写格式... ...

  3. Python使用otp实现二步验证

    https://www.cnblogs.com/lori/p/11077161.html https://blog.coding.net/blog/two-factor-authentication ...

  4. 读redux源码总结

    redux介绍 redux给我们暴露了这几个方法 { createStore, combineReducers, bindActionCreators, applyMiddleware, compos ...

  5. C++入门经典-例6.21-比较string字符串,比较两个字符串

    1:使用“>”.“!=”.“>=”等比较运算符可以比较两个字符串的内容.比较的方法是将两个string字符串从头开始比较每一个字符,直到出现两者不一致.比较这两个不相同的字符的字面值,得出 ...

  6. PHP压缩图片并模糊处理(抄的哟)

    class image_blur{ /** * 图片高斯模糊(适用于png/jpg/gif格式) * @param $srcImg 原图片 * @param $savepath 保存路径 * @par ...

  7. Fastadmin 后台编辑,或者添加的时候,出现的问题

    1.情况如图:编辑的时候,这个关联id,默认查出来的是用户昵称,如果要显示用户名,该怎么修改,不要着急,听我慢慢道来 2.首先要找到 编辑页面,检查问题 3.完成

  8. Laravel 中如何区别 Model 或者是 Builder?

    User::where('id',1)->update([])  和  User::find(1)->update([]) 有异曲同工之效.   额? 当你通过 Laravel 与数据库交 ...

  9. ul 加 li 实现 select 下拉选功能

    由于 select 没有选中事件(onchange 事件在内容改变时才会触发,选择同一个条目不会触发),只好用其他控件来实现. <!doctype html> <html lang= ...

  10. HTML中meta=“viewport”的介绍

    viewport就是浏览器上用来显示网页的那部分区域 layout viewport:整个网页所占据的区域(包括可视也包括不可视的区域)  默认的 visual viewport:网页在浏览器上的可视 ...