string 類的傳統寫法與現代寫法
阿新 • • 發佈:2018-12-27
傳統寫法
傳統寫法的 string 類,可讀性高
class String { public: String(const char* str = "") { //構造 string 類物件時,如果傳遞 nullptr 指標,認為程式非法 if (str == nullptr) { assert(false); return; } _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) { if (this != &s) { char* pStr = new char[strlen(s._str) + 1]; strcpy(pStr, s._str); delete[] _str; _str = pStr; } return *this; } //解構函式僅僅析構建構函式開闢出來的空間 ~String() { delete[] _str; _str = nullptr; } private: char* _str; };
現代寫法
現代寫法的 string類程式碼簡潔,new 與 delete 都在同一塊地方,程式碼維護性高
namespace mod { class String { public: String(const char* str = "") { if (nullptr == str) { str = ""; } _str = new char[strlen(str) + 1]; strcpy(_str, str); } String(const String& s) : _str(nullptr) { String strTmp(s._str); swap(_str, strTmp._str); } String& operator=(String s) { swap(_str, s._str); return *this; } String& operator=(const String& s) { if (this != &s) { String strTmp(s._str);//用傳入引數構造當前物件,然後交換 swap(_str, strTmp._str); } } ~String() { delete[] _str; _str = nullptr; } private: char* _str; }; }