传统写法:
#include#include using namespace std;class String{public: //构造函数是用系统传入的str去构造_STR String(char* str = "") :_str( new char[strlen(str) + 1]) { strcpy(_str, str); } //拷贝构造是将已存在的String s 类中的_str去构造_str。 String(String& s) :_str(new char[strlen(s._str) + 1]) { strcpy(_str, s._str); } //复制运算符重载已存在的String s 类中的_str去赋值给tmp。 //String& operator = (const String& s) //{ // if (&s != this) // { // delete[] _str; // char* tmp = new char[strlen(s._str) + 1]; // strcpy(tmp, s._str); // } // return *this; //} String& operator = (const String& s) { if (&s != this) { char* tmp = new char[strlen(s._str) + 1]; strcpy(tmp, s._str); //先释放后指向,否则_str无人管理会内存泄漏 delete[] _str; _str = tmp; } return *this; } ~String() { if (_str) { delete[] _str; } }private: char* _str; };void Test(){ String s1("s1"); String s2(s1);}int main(){ Test(); system("pause");}
现代写法:
#include#include using namespace std;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(tmp._str, _str); } String& operator = (const String& s) { if (&s != this) { String tmp = s._str; swap(tmp._str, _str); } return *this; } ~String() { if (_str) { delete[] _str; } }private: char* _str;};void Test(){ String s1("s1"); String s2(s1);}int main(){ Test(); system("pause");}