zoukankan      html  css  js  c++  java
  • C++ 深拷贝和浅拷贝详解

    前言

    在对象拷贝过程中,如果没有自定义拷贝构造函数,系统会提供一个缺省的拷贝构造函数,缺省的拷贝构造函数对于基本类型的成员变量,按字节复制,对于类类型成员变量,调用其相应类型的拷贝构造函数。

    位拷贝(浅拷贝)举例,a指向b,b的改变其实会影响a的改变,同时a原本指向的空间发生泄漏。

    然后这种情况下有了深拷贝。

    何时调用?

    以下情况都会调用拷贝构造函数:
    一个对象以值传递的方式传入函数体
    一个对象以值传递的方式从函数返回
    一个对象需要通过另外一个对象进行初始化。

    然后,我们现在从概念来理解一波

    浅拷贝:位拷贝,拷贝构造函数,赋值重载

    多个对象共用同一块资源,同一块资源释放多次,崩溃或者内存泄漏。

    深拷贝:每个对象共同拥有自己的资源,必须显式提供拷贝构造函数和赋值运算符。

     1 class String
     2 {
     3  
     4 public:
     5     const char* c_str()
     6     {
     7         return _str;
     8     }
     9  
    10     String(const char* str = "")
    11         :_str(new char[strlen(str) + 1])
    12     {
    13         strcpy(_str, str);
    14     }
    15     String(const String &s)
    16         :_str(NULL)
    17     {
    18         String tmp(s._str);
    19         swap(_str, tmp._str);
    20     }
    21     ~String()
    22     {
    23         if (_str)
    24         {
    25             delete[]_str;
    26         }
    27     }
    28  
    29 private:
    30     char* _str;

    通过开辟空间的方式,进行深拷贝

    1 String s1("字符串1");
    2 String s2(s1);
    3 cout << s2.c_str() << endl;

    拷贝成功;

    这种方式采取的  拷贝构造,注意这个

    1 String(const String &s)
    2         :_str(NULL)
    3     {
    4         String tmp(s._str);
    5         swap(_str, tmp._str);
    6     }

    代码解析:其中this指向拷贝的对象,s指向试图拷贝的原对象。(测试中的  this指向s2,s指向s1)

    其中利用构造函数开辟空间,建立临时的tmp,然后进行交换完成拷贝。

  • 相关阅读:
    堆排序回顾
    动画函数封装
    mouseenter 和mouseover的区别
    元素滚动 scroll 系列
    元素可视区 client 系列
    元素偏移量 offset 系列
    JS执行机制
    BOM
    常用键盘事件
    常用鼠标事件
  • 原文地址:https://www.cnblogs.com/loliconinvincible/p/12556028.html
Copyright © 2011-2022 走看看