您好,登錄后才能下訂單哦!
簡單實現string類,正確管理資源。
1、首先定義它的成員變量:
private: char* _data;//定義一個字符指針
2、實現它的構造函數:
String(const char* str="") //如果定義對象時沒有傳參數,使用缺省構造參數構造出""字符串 :_data(new char[strlen(str)+1]) //+1表示多創(chuàng)建一個空間存'\0' { strcpy(_data,str); }
3、實現拷貝構造
如果我們在實現拷貝構造時(賦值運算符重載類似),進行簡單賦值的淺拷貝
String(const String& s) : _data(s._data) {}
當類里面有指針對象時,進行簡單賦值的淺拷貝,兩個對象指向同一塊內存,析構時delete兩次一個內存塊,會崩潰。所以必須進行深拷貝
String(const String& s) :_data(new char[strlen(s)+1]) { strcpy(_data,s._data); }
現代寫法
//利用構造函數,傳入s._data創(chuàng)建對象tmp,然后交換_data,tmp._data。此時_data指向根據構造函數new出來的新數據,即_data指向tmp._data,而tmp._data指向NULL。出了函數作用域后,自動調用tmp的析構。這種寫法可以只用在構造和析構里,開辟空間或釋放空間。
String(const String& s) :_data(NULL) { String tmp(s._data); swap(_data,tmp._data); }
4、實現賦值運算符重載
String& operator=(const String& s) { if(this!=&s) { delete []_data;//如果此時的對象是缺省參數構造的,也會開辟空間存'\0',所以都得delete _data=new char[strlen(s._data)+1]; strcpy(_data,s._data); } return *this; }
現代寫法
//String s此時參數沒有傳&,實參傳進來時,會調用拷貝構造函數 s(實參),swap后_data指向s._data,而s出作用域后被析構
String& operator=(String s) { swap(_data,s._data); return *this; }
如果此時對象S=S,那么會多開辟一塊空間,來保存相同的字符串,這樣會浪費空間,改進后的代碼:
String& operator=(const String& s) { if (this != &s) { String tmp(s._data); swap(tmp._data); } return *this; }
5.析構
~String() { if(_data) { delete[] _data; _data=NULL; } }
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。