zoukankan      html  css  js  c++  java
  • C++网易云课堂开发工程师-拷贝构造,拷贝复制,析构函数

    1.带有指针的ClassClass with pointer member

    当类内带指针,一定自己写出拷贝构造函数。

    String s1();

    String s2("hello");

    String s3(s1);                                                                  拷贝构造

    s3=s2;                                                                              拷贝赋值

    往往编译器会自动完成拷贝构造拷贝赋值,不带有指针的可以一个数据成员一个数据成员的赋值。

    但是带有指针时,会出现不同的效果。

    2.Class String

    class String{

    public:

      String(const char* cstr = 0);

      String(const String& str);                                      接受自己本身,我们称之为拷贝构造

      String& operator = (const String& str);              拷贝赋值

      ~String();                                                                 析构函数

      char* get_c_str() const {return m_data;}

    private:

      char* m_data;                                                                

    }

    3.ctor和dtor(构造函数和析构函数)

    inline

    String::String(const char* cstr = 0){

      if(cstr){

        m_data = new char[strlen(cstr) + 1];

        strcpy(m_data, cstr);

      }

      else{                                                                                               未定义初值

        m_data = new char[1];

        *m_data = '';

      }

    }

    inline                                                                                                      做动态分配后,一定要释放掉

    String::~String(){

      delete[] m_data;                                                                            搭配中括号的delete

    }

    4.类的创建与调用

    {

      String s1();                                                                                     

      String s2("hello");                                                                          离开作用域后,析构函数自然而然会被调用

      String* p = new String("hello");

      delete p;                                                                                           必须使用delete搭配删除

    }

    ~~~~~~~~~~~一共要调用三次析构函数~~~~~~~~~~~~~

    5.class with pointer members 必须有copy ctor copy op=

    String a("hello");                                            对应的是                              a---------->Hello

    String b("World");                                         对应的是                              b---------->World

    使用default copy ctor 或者 default op= 会造成以下局面

    a--------------->Hello<------------------b           World                              浅拷贝

    ~~~~~~~必须完成深拷贝,主要是通过创建数据副本~~~~~~~~~

    inline

    String::String(const String& str){

      m_data = new char[strlen(str.m_data) + 1];                                       创建数据副本

      strcpy(m_data, str.m_data);

    }

    ~~~拷贝赋值,因为当前创建空间所以一定要清空自己,而后进行赋值~~~

    ~~~拷贝构造不需要完成清空自己是因为它刚刚创建出来的~~~~~~~~

    inline

    String& String::operator= (const String& str){

      if(this == &str){                                                                                      检测自我赋值/如果这两行没有写检测,甚至会造成结果出错。

        return *this;

      }

      delete[] m_data;

      m_data = new char[strlen(str.m_data) + 1];

      strcpy(m_data,  str.m_data);

      return *this;

    }

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    如果if语句没有写,会造成自己销毁自己,而不会完成赋值操作。

  • 相关阅读:
    内存泄漏 Memory Leaks 内存优化 MD
    Handler Thread 内部类引起内存泄露分析
    为什么不取消注册BroadcastReceiver会导致内存泄漏
    WebChromeClient 简介 API 案例
    WebViewClient 简介 API 案例
    java.net.URI 简介 文档 API
    android.net.Uri 简介 API
    RV 多样式 MultiType 聊天界面 消息类型 MD
    JS函数声明与定义,作用域,函数声明与表达式的区别
    CSS中table tr:nth-child(even)改变tr背景颜色: IE7,8无效
  • 原文地址:https://www.cnblogs.com/sky-z/p/9505750.html
Copyright © 2011-2022 走看看