對於string類有多種構造形式,下面就來看看string類幾種不同構造形式之間的不同吧。
1.淺拷貝
淺拷貝是最簡單的
它的**量是最少的,但是卻有問題。class string
string(const
char* pstr)
:_pstr(new
char[strlen(pstr) + 1])
~string()
}private:
char* _pstr;
};
它的拷貝建構函式與賦值運算子過載都沒有重新分配空間,只是把原來的空間重新命名了兩次,所以在析構的時候就出錯了。析構第二個物件時,空間已經不存在了,所以就會報錯。
在繼續執行就會報錯。
2.深拷貝
深拷貝是在淺拷貝的基礎上重寫了拷貝建構函式和賦值運算子過載函式,給物件重新開闢了空間,並將原來物件的內容拷貝過去。
重寫深拷貝的幾個函式
3.簡潔版的深拷貝size_t size()const
size_t length()const
char& operator(size_t index)
const
char& operator(size_t index)const
//const char& operator(size_t index);
bool
operator>(const string& s)
}return
false;
}bool
operator
bool
operator==(const string& s)
return
true;
}bool
operator!=(const string& s)
void copy(const string& s)
}bool
strstr(const string& s)
}if(j == strlen(_pstr))
return
true;
}return
false;
}string& operator+=(const string& s)
建構函式與析構函式沒有變化,使用swap()重寫了拷貝建構函式與賦值運算子過載函式。class string
else
}string(const string& s)
string & operator=(const string& s)
return *this;
}~string()
}private:
char* _pstr;
};
但是要注意,pstr = new char[strlen(s._pstr)+1];不能缺少,因為交換後的strtemp._pstr是乙個野指標,沒有合法的位址空間,析構時就會出錯,所以需要先給_pstr一段空間,或者是在交換後將_pstr置為空指標->_pstr=null;
4.引用計數的string類string(const
string& s)
賦值運算子過載也與拷貝建構函式的執行類似。
5.寫時拷貝
寫時拷貝是在申請空間時多申請4個用來存放指向這段空間的指標的個數。他是在引用計數得基礎上修改的,用乙個_pcount指標來存放指向該段空間的個數,只有在需要修改某個值時,為了避免修改其他物件的值,需要重新開闢空間。否則,這樣可以節省記憶體,要析構某個函式時只需要將(_pcount)–就行了。class string
string(const string& s)
:_pstr(s._pstr)
string & operator=(const string& s)
return *this;
}char& operator(size_t index)
return _pstr[index];
}int& getcount()
void relese()
}~string()
private:
char* _pstr;
};
String類,淺拷貝,深拷貝
想要使用c 中的類那麼必須要有它的標頭檔案,include 首先來看下面乙個 這個程式很簡單,但是如果有乙個空指標呢?那麼就需要判斷了,並且用預設值把有引數的string和沒有引數的string合併在一起,那這個程式只需要做下面的改變 既然你的建構函式開闢了一段空間,那麼就需要釋放掉,此時就需要析構...
String類與深淺拷貝
1 概念 被複製物件的所有變數都含有與原來的物件相同的值,而所有的對其他物件的引用仍然指向原來的物件。換言之,淺拷貝僅僅複製所考慮的物件,而不是複製它所引用的物件。2 舉例 class string else string const string s string operator const s...
String類之 深拷貝
上篇部落格我們說淺拷貝存在同一塊資源被多次釋放的問題,那麼這篇部落格就是給淺拷貝擦屁股,解決它遺留下來的問題。解決這個問題,我們可以考慮單獨給 s2 開闢一塊空間,只將 s1 裡的內容拷貝到 s2。看一看我們 是怎麼實現的吧 class string else 普通版版本 string const ...