拷貝建構函式、拷貝運算子、析構函式
class hasptr{
public:
hasptr(const string &s = string()):ps(new string(s)), i(0) {
cout<
hasptr hp("hello"); // 呼叫建構函式,輸出hasptr(const string &s = string())
hasptr hp1 = hp; // 呼叫拷貝建構函式,輸出hasptr(const hasptr &hp)
hasptr hp2; // 呼叫建構函式,輸出hasptr(const string &s = string())
hp2 = hp; // 呼叫拷貝運算子函式,輸出hasptr &operator=
hp1.setps("word"); // 建構函式、拷貝建構函式、拷貝賦值運算子函式都為ps分配了新空間
hp.print(); // 所以hp、hp1、hp2的ps指標指向的空間不一樣,修改乙個的值其他的不變。
hp1.print(); // 輸出word,由setps函式修改
hp2.print(); // 輸出hello,值從hp拷貝過來,空間是新分配的。
// 實參初始化形參要呼叫一次拷貝建構函式,形參初始化返回的臨時變數也要呼叫一次拷貝建構函式,
hp.testcopy(hp1); // 形參和臨時變數在函式結束時時要銷毀,呼叫兩次析構函式。
hp.testcopy1(hp1); // 都是引用初始化,不需要呼叫拷貝建構函式。
hasptr *hp_ptr = new hasptr; // 呼叫建構函式
vectorvec; // 呼叫vector的預設建構函式。
vec.push_back(hp); // 呼叫拷貝建構函式
// 接下來要銷毀hp,hp1,hp2和vector中的hasptr的元素,要呼叫4次析構函式,但是hp_ptr指向的空間不會被銷毀。
// 建構函式,為指標指向分配空間(整個類也只在這個地方分配空間),use初始化為1
hasptr(const string &s = string()):ps(new string(s)), i(0) ,use(new size_t(1)){
cout
hasptr hp("hello"); // 呼叫建構函式,輸出hasptr(const string &s = string())
hasptr hp1 = hp; // 呼叫拷貝建構函式,輸出hasptr(const hasptr &hp)
hasptr hp2; // 呼叫建構函式,輸出hasptr(const string &s = string())
hp2 = hp; // 呼叫拷貝運算子函式,輸出hasptr &operator=
hp1.setps("word"); // 拷貝建構函式、拷貝賦值運算子不為指標ps和use分配新空間
hp.print(); // 所以hp、hp1、hp2的ps指標指向相同的空間,修改乙個的值其他的也變。
hp1.print(); // 輸出word,由setps函式修改
hp2.print(); // 輸出word,由setps函式修改
// 實參初始化形參要呼叫一次拷貝建構函式,形參初始化返回的臨時變數也要呼叫一次拷貝建構函式,
hp.testcopy(hp1); // 形參和臨時變數在函式結束時時要銷毀,呼叫兩次析構函式。
hp.testcopy1(hp1); // 都是引用初始化,不需要呼叫拷貝建構函式。
hasptr *hp_ptr = new hasptr; // 呼叫建構函式
vectorvec; // 呼叫vector的預設建構函式。
vec.push_back(hp); // 呼叫拷貝建構函式
// 接下來要銷毀hp,hp1,hp2和vector中的hasptr的元素,要呼叫4次析構函式,只有最後一次呼叫析構函式才會釋放ps和use指向的空間。
// 但是hp_ptr指向的空間不會被銷毀。
拷貝建構函式 拷貝賦值運算子和析構函式
當定義乙個類時,我們顯式或隱式的指定物件拷貝,移動,複製和銷毀時做什麼。通過5類特殊成員函式來控制這些操作 拷貝建構函式 拷貝複製運算子 移動建構函式 移動複製運算子和析構函式。如果乙個類沒有定義這些,編譯器會自動定義缺失的操作。但對於一些類來說,預設定義可能導致災難。拷貝建構函式定義了當用同型別物...
建構函式,拷貝建構函式,析構函式,賦值運算子過載
1 建構函式 定義 是乙個特殊的成員函式,名字與類名相同,建立類型別物件時,由編譯器自動呼叫,在物件的生命週期內有且只呼叫一次,以保證每個資料成員都有乙個合適的初始值。特性 1 函式名與類名相同。2 沒有返回值。3 有初始化列表 可以不用 4 建構函式可以過載,實參決定了呼叫那個建構函式。5 如果沒...
C 拷貝構造 拷貝複製 析構函式
帶有指標的成員的類必須有拷貝建構函式和拷貝賦值函式,淺拷貝預設的賦值函式會將乙個指標賦值給另乙個,導致進行賦值的物件指標指向的內容記憶體洩漏 string.h ifndef mystring define mystring class string private char m data endif...