侯捷C++手把手教学:三大函数:拷贝构造,拷贝赋值,析构

    科技2024-01-10  73

    三大函数:拷贝构造,拷贝赋值,析构 当类中含有指针,则不能用系统默认的那一套拷贝构造,拷贝赋值。

    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; };

    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 = '\0'; } } inline String::~String() //离开作用域,调用析构函数 { delete[] m_data; //释放掉因创建对象动态分配的内存 |

    这里我们要自己定义拷贝构造函数。若自定义的类中有指针,系统默认的构造函数只会浅拷贝,将指针拷贝。这里会产生两个问题:产生内存泄漏;产生别名,很危险。

    copy ctor(拷贝构造函数)

    inline String::String(const String& str) { m_data=new char[ strlen(str.m_data) + 1 ]; strcpy(m_data, str.m_data); } { String s1("hello"); String s2(s1); //直接取另一个object的private data(兄弟之间互为friend) // String s2 = s1; }

    copy assignment operator(拷贝赋值函数)

    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; }
    Processed: 0.015, SQL: 8