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语句没有写,会造成自己销毁自己,而不会完成赋值操作。

  • 相关阅读:
    51Nod1528 加号分配
    51Nod1679 连通率
    51Nod1679 连通率
    51Nod1426 沙拉酱括号
    51Nod1426 沙拉酱括号
    51Nod1678 lky与gcd
    51Nod1556 计算
    c学习第2天
    Stopwatch秒表的使用
    数据从.txt文件中导入数据库
  • 原文地址:https://www.cnblogs.com/sky-z/p/9505750.html
Copyright © 2011-2022 走看看