1、概念:被複製物件的所有變數都含有與原來的物件相同的值,而所有的對其他物件的引用仍然指向原來的物件。換言之,
淺拷貝僅僅複製所考慮的物件,而不是複製它所引用的物件。
2、舉例
class string
else
}string(const string& s)
string& operator = (const string& s)
return *this;
} ~string() }
private:
char* _pstr;
};void funtest()
int main()
淺拷貝優化一不能實現所有的拷貝///
class string
else
}string(string& s)//拷貝建構函式
:_pstr(s._pstr)//當前指標和s指標指向同乙個空間
,_pcount(++s._pcount)
{} string& operator = (string& s)//賦值運算子過載
_pcount = ++s._pcount;//如果不為0指向新空間,則指向該空間物件數加1
_pstr = s._pstr;
} return *this;
} ~string()//析構函式 }
private:
char* _pstr;
int _pcount;
};void funtest()
int main()
淺拷貝優化二可以實現部分拷貝
class string
else
_pcount = 1;
} string(string& s)//拷貝建構函式
:_pstr(s._pstr)//當前指標和s指標指向同乙個空間
string& operator = (string& s)//賦值運算子過載
++_pcount;//如果不為0指向新空間,則指向該空間物件數加1
_pstr = s._pstr;
} return *this;
} ~string()//析構函式 }
private:
char* _pstr;
static int _pcount;//類裡宣告
};int string::_pcount = 0;//類外定義
void funtest()
int main()
/淺拷貝3所有型別可以全部實現
class string
else
}string(string& s)//拷貝建構函式
:_pstr(s._pstr)//當前指標和s指標指向同乙個空間
,_pcount(s._pcount)//兩個物件指向同乙個計數空間
string& operator = (string& s)//賦值運算子過載
_pstr = s._pstr;
_pcount = s._pcount;//指向新的物件引用計數
++(*_pcount);//如果不為0新空間引用計數加1
} return *this;
} ~string()//析構函式 }
private:
char* _pstr;
int* _pcount;
};void funtest()
int main()
1、概念:被複製物件的所有變數都含有與原來的物件相同的值,除去那些引用其他物件的變數,那些引用其他物件的變數將指向被複製的物件,而不是原來有那些引用的物件,換言之,
深複製把要複製的物件所引用的物件都複製一遍。
2、舉例
/深拷貝普通版///
class string
else
}string(const string& s)//深拷貝拷貝建構函式
:_pstr(new char[strlen(s._pstr)+1])//初始化列表給_pstr開闢新空間,防止後面析構函式釋放該空間出錯。
string& operator = (const string &s)//深拷貝賦值運算子過載
return *this;
} ~string()//深拷貝析構函式 }
private:
char * _pstr;
};void funtest()
int main()
///深拷貝簡潔版/
class string
else
}string(const string& s)//深拷貝拷貝建構函式
:_pstr(null)//初始化列表給_pstr指向空,防止後面析構函式釋放該空間出錯。
string& operator = (const string& s)//賦值運算子過載<1>
return *this;
} string& operator = (string s)//賦值運算子過載<2>,值的形式傳遞,建立臨時變數
~string()//深拷貝的析構函式 }
private:
char* _pstr;
};void funtest()
int main()
string類的深淺拷貝問題
字串是我們在編寫程式的時候經常用的到的。c 庫已經幫我們實現了乙個功能更加強大的字串類string,我們要去了解它是怎麼實現的。只要是涉及到 string類的地方多少都會涉及到深淺拷貝的問題。在c 中,在用乙個物件初始化另乙個物件時,只複製了成員,並沒有複製資源,使兩個物件同時指向了同一資源的複製方...
關於string類的深淺拷貝問題
首先,先看一下下面的 會出現什麼問題?class string else string string const string s data s.data private char data void test 上面的程式會奔潰,讓我們來分析原因 這就是所謂的淺拷貝,也稱位拷貝,編譯器只是直接將指標...
面試題一 string類的深淺拷貝
pragma once include using namespace std 淺拷貝 析構物件時會出錯 class cmystring else 拷貝建構函式 cmystring const cmystring str m pdata null 析構函式 cmystring 賦值運算子過載 cmy...