String類深拷貝的現代寫法和傳統寫法
阿新 • • 發佈:2019-01-08
1.傳統寫法:老老實實開闢空間並複製內容
2.現代寫法:藉助中間變數,交換指標
#include<iostream> using namespace std; //String類傳統寫法 namespace tradition { class String { public: //構造 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() { if(_str) delete[] _str; } //賦值運算子過載 String& operator=(const String& s) { if(this != &s) //防止自己給自己賦值 { delete[] _str; //釋放原空間 _str = new char[strlen(s._str)+1]; //開新空間 strcpy(_str, s._str); //賦值 } return *this; } char* GetStr() { return _str; } private: char* _str; }; } //String類現代寫法 namespace modern { class String { public: //構造,析構,列印,都和傳統寫法一樣 String(char* str = "") :_str(new char[strlen(str)+1]) { strcpy(_str, str); } ~String() { delete[] _str; } char* GetStr() { return _str; } //拷貝構造,賦值運算子過載另外寫,藉助中間變數,不用直接開闢空間 String(const String& s) :_str(NULL) { String tmp(s._str); //建構函式 swap(_str, tmp._str); } String& operator=(const String& s) { if(this != &s) { String tmp(s._str); swap(_str, tmp._str); } return *this; } private: char* _str; }; }