每當程序生成了對象的副本,編譯器都將調用複製構造函數。具體來講,當函數按值傳遞對象或者返回對象時,都將使用複製夠着函數。 程序員
淺複製:默認複製構造函數,逐個複製非靜態成員,複製的是成員的值。 tcp
深複製:複製構造函數應當複製字符串並將副本的地址賦給str成員。不是僅僅複製字符串的地址。這樣在調用析構函數時就不會出現釋放已經釋放的字符串。 函數
複製構造函數和賦值運算符重載的幾個區別: this
1. 複製構造函數沒有返回值,賦值運算符返回對象的一個引用。 spa
2. 複製構造函數以前對象沒有分配內存,不須要delete 指針
3.複製構造函數會增長對象的個數 code
StringBad::StringBad(const StringBad &st) { //對象個數 ++ len = st.len; str = new char[len + 1]; std::stcpy(str,st.str); } StringBad &StringBad::operator=(const StringBad &st) { if (this == &st) return *this; delete []str; len = st.len; str = new char [len + 1]; std::strcpy(str,st.str); return *this; }
能夠這樣避免編譯器生成默認的構造函數和賦值運算符重載函數 對象
class Queue { private: Queue(const Queue &){} Queue &operator=(const Queue &){ // return *this; } }c程序員一般使用NULL而不是0來表示一個指針爲空;用'\0'來指明字符串的結束,而不是0
語法:classname::func(int n,int m):mem1(n),mem2(m) {} 內存
做用:這些初始化工做是在對象建立時完成的,此時還未執行括號中任何代碼。 字符串
成員初始化順序於他們出如今類中的順序相同,於他們在初始化成員列表順序無關。