string的传统与现代写法

    xiaoxiao2021-03-25  138

    .深拷贝-->传统写法 

    class String { public: /*String() :_str(new char[1]) { _str[0] = ‘\0‘; }*/ String(char* str = "") :_str(new char[strlen(str) + 1]) { strcpy(_str, str); } String(const String& s) :_str(new char[strlen(s._str) + 1]) { strcpy(_str, s._str); } String& operator=(const String&s) //重载写法1,不完善 { if (this != &s) { delete[] _str; _str = new char[strlen(s._str) + 1]; strcpy(_str, s._str); } return *this; } String& operator=(const String& s)//重载写法2,思路更健全 { char* tmp = new char[strlen(s._str) + 1]; strcpy(tmp, s._str); delete[] _str; _str = tmp; } ~String() { /*if (_str)*/ delete[] _str; } private: char* _str; }; void Test1() { String s1("s1"); //String s3(); String s2(s1); } int main() { Test1(); system("pause"); return 0; }

        

        3.深拷贝-->现代写法

    class String { public: String(char* str = "") :_str(new char[strlen(str) + 1]) { strcpy(_str, str); } String(const String& s) :_str(NULL) { String tmp(s._str); swap(_str, tmp._str); } String& operator=(String s)//针对已经存在的两个字符串类型 所以直接交换即可 隐试生成一块临时空间,交换后把可把原来的空间释放掉 { swap(_str, s._str); return *this; } ~String() { /*if (_str)*/ delete[] _str; } private: char* _str; }; void Test1() { String s1("s1"); //String s3(); String s2(s1); } int main() { Test1(); system("pause"); return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-8798.html

    最新回复(0)