#includeusing namespace std; class String { public: /*String(const char* str=" ") :_str(new char[strlen(str)+1]) { strcpy(_str, str); } */ String(const char* str = " ") { if (str == NULL) { _str = new char; _str[0] = '\0'; } else { _str = new char[strlen(str) + 1]; strcpy(_str, str); } } /*String(const String& other) :_str(NULL) { _str = new char[strlen(other._str) + 1]; strcpy(_str, other._str); }*/ String(const String& other) :_str(NULL) { String tmp(other._str);//創(chuàng)建一個臨時對象 swap(_str, tmp._str); } String& operator=(String& other) { if (this != &other) { delete[] _str; _str = new char[strlen(other._str) + 1]; strcpy(_str, other._str); } return *this;//返回值支持鏈?zhǔn)奖磉_(dá)式 } char *GetStr() { return _str; } char& operator[](size_t index)//若不用引用,再它返回時會返回一個匿名對象為一個常量不可改變 { return _str[index]; } /*String& operator=(String other) { swap(_str, other._str);//現(xiàn)代寫法即傳過來一個臨時對象 return *this; }*/ ~String() { if (_str) delete[] _str; } protected: char *_str; }; void Test() { char* ptr = "abcd"; String s1(ptr); String s2(s1); String s3("def"); s3 = s2; //s1[0] = 'x'; cout< 若只定義一個全局的整型變量,它只適用于指向同一個內(nèi)存塊。
創(chuàng)新互聯(lián)自2013年創(chuàng)立以來,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都網(wǎng)站設(shè)計、成都網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元龍華做網(wǎng)站,已為上家服務(wù),為龍華各地企業(yè)和個人服務(wù),聯(lián)系電話:18980820575
用引用計數(shù)解決淺拷貝后多次析構(gòu)崩潰問題(寫時拷貝),每塊空間都有各自的指針指向。
#includeusing namespace std; class String { public: String(const char* str = " ") :_str(new char[strlen(str) + 5]) { *((int*)_str) = 1; //多開4字節(jié)空間保存有幾個指針指向該塊空間 _str += 4; strcpy(_str, str); } /*String(const char* str = " ") { if (str == NULL) { _str = new char; _str[0] = '\0'; } else { _str = new char[strlen(str) + 1]; strcpy(_str, str); } }*/ String(const String& other) :_str(other._str) { ++*(((int*)_str)-1); } //String(const String& other) //:_str(NULL) //{ //String tmp(other._str);//創(chuàng)建一個臨時對象 //swap(_str, tmp._str); //} String& operator=(String& other) { if (this != &other) { if (--*(((int*)_str) - 1) == 0) { //若只有一個指針指向該空間則釋放掉它,讓其重新指向另一塊空間 _str -= 4;//釋放空間時一定從頭釋放 delete[] _str; } } _str = other._str; ++*(((int*)(other._str))-1); return *this;//返回值支持鏈?zhǔn)奖磉_(dá)式 } char *GetStr() { return _str; } char& operator[](size_t index)//若不用引用,再它返回時會返回一個匿名對象為一個常量不可改變 { return _str[index]; } /*String& operator=(String other) { swap(_str, other._str);//現(xiàn)代寫法即傳過來一個臨時對象 return *this; }*/ ~String() { if (_str) { if (--*(((int*)_str) - 1) == 0) { _str -= 4; //釋放空間時一定從頭釋放 delete[] _str; } } } protected: char *_str; }; void Test() { char* ptr = "abcd"; String s1(ptr); String s2(s1); String s3("def"); s3 = s2; //s1[0] = 'x'; cout << s3.GetStr() << endl; }
本文標(biāo)題:簡單的String類實現(xiàn)及寫時拷貝
本文路徑:http://weahome.cn/article/jjhsjd.html