足跡C primer 43 拷貝控制和資源管理

2021-06-22 17:54:46 字數 3388 閱讀 1672

拷貝控制和資源管理

*定義乙個拷貝建構函式,完成string的拷貝,而不是拷貝指標

*定義乙個析構函式來釋放string

*定義乙個拷貝賦值運算子來釋放物件當前的string,並從右側運算物件拷貝string

class   hasptr

//對ps指向的string,每個hasptr物件都有自己的拷貝

hasptr(const hasptr &p):ps(new string(*p.ps)), i(p.i) {}

hasptr & operator=(const hasptr &);

~hasptr()

private:

string *ps;

int i;

};

hasptr& hasptr::operator=(const hasptr &rhs)

這裡有乙個錯誤的示範!!

hasptr& hasptr::operator=(const hasptr &rhs)

看出來了麼,這裡new string(*(rhs.ps))裡面的ps是已經釋放了的,也就是把釋放過的記憶體拿來賦值,顯然是未定義的

令乙個類展現類似指標的行為的最好的方法是使用shared_ptr來管理類中的資源

但是,有時候我們希望直接管理資源。在這種情況下,使用引用計數

void fun1()

class hasptr2

//拷貝建構函式拷貝所有三個資料成員,並遞增計數器

hasptr2(const hasptr2 &p):ps2(p.ps2), i2(p.i2), use(p.use)

hasptr2 & operator=(const hasptr2 &);

~hasptr2();

private:

string *ps2;

int i2;

size_t *use; //記錄有多少個物件共享*ps的成員

};hasptr2::~hasptr2()

}hasptr2 & hasptr2::operator=(const hasptr2 &rhs)

/*上面這個if應該如何去看呢?

rhs拷貝給乙個物件的時候,指向rhs的物件就會多乙個所以++

然後拷貝的物件,得到新值就會把原來的值去掉所以會--

然後看是不是最後乙個是的話直接銷毀,不是那就不管--就可以了

*/ps2=rhs.ps2;

i2=rhs.i2;

use=rhs.use;

return *this; //返回本物件

}

/**

* 功能:拷貝控制和資源管理

*/#include#includeusing namespace std;

/**************************************

13.2.1行為像值的類

**************************************/

/**定義乙個拷貝建構函式,完成string的拷貝,而不是拷貝指標

*定義乙個析構函式來釋放string

*定義乙個拷貝賦值運算子來釋放物件當前的string,並從右側運算物件拷貝string

*/class hasptr

//對ps指向的string,每個hasptr物件都有自己的拷貝

hasptr(const hasptr &p):ps(new string(*p.ps)), i(p.i) {}

hasptr & operator=(const hasptr &);

~hasptr()

private:

string *ps;

int i;

};/**

類值拷貝賦值運算子

*/hasptr& hasptr::operator=(const hasptr &rhs)

//這裡有乙個錯誤的示範!!

/*hasptr& hasptr::operator=(const hasptr &rhs)

*///看出來了麼,這裡new string(*(rhs.ps))裡面的ps是已經釋放了的,也就是把釋放過的記憶體拿來賦值,顯然是未定義的

/**************************************

13.2.2定義行為像指標的類

**************************************/

/*令乙個類展現類似指標的行為的最好的方法是使用shared_ptr來管理類中的資源

但是,有時候我們希望直接管理資源。在這種情況下,使用引用計數

*//**

引用計數

*/void fun1()

/**定義乙個使用引用計數的類

*/class hasptr2

//拷貝建構函式拷貝所有三個資料成員,並遞增計數器

hasptr2(const hasptr2 &p):ps2(p.ps2), i2(p.i2), use(p.use)

hasptr2 & operator=(const hasptr2 &);

~hasptr2();

private:

string *ps2;

int i2;

size_t *use; //記錄有多少個物件共享*ps的成員

};hasptr2::~hasptr2()

}hasptr2 & hasptr2::operator=(const hasptr2 &rhs)

/*上面這個if應該如何去看呢?

rhs拷貝給乙個物件的時候,指向rhs的物件就會多乙個所以++

然後拷貝的物件,得到新值就會把原來的值去掉所以會--

然後看是不是最後乙個是的話直接銷毀,不是那就不管--就可以了

*/ps2=rhs.ps2;

i2=rhs.i2;

use=rhs.use;

return *this; //返回本物件

}int main()

ps:這期還是沒有效果圖,因為我都沒有在主函式中加相應的函式,不過無所謂啦,**是沒錯的,能通過編譯,至少沒有語法錯誤,還有就是定義類,應該不會出現邏輯錯誤吧!!!嘿嘿,其實這節應該可以9點左右就發出來的,但是你能想象我9點左右出去列印**嗎????

列印 蒼老師的**!!!蒼老師!!!沒錯就是蒼井空。。。。列印室的老闆盯著我看了半天,這傢伙幹嘛。。。。

c primer要點 拷貝控制

1.default 顯式要求編譯器生成合成版本 delete 定義為刪除的函式阻止拷貝。2.右值引用只能繫結到將要銷毀的物件 std move 獲得繫結到左值上的右值引用 移動建構函式的第乙個引數應該是該型別的右值引用,移動操作不應丟擲異常,可以指明noexcept承諾。標準庫容器能對異常發生時其自...

C primer學習 拷貝控制 1

1 我們使用 定義變數 2 從乙個返回型別為非引用的函式返回物件 3 用花括號列表初始化乙個陣列中的元素或者乙個聚合類的成員.4 某些類型別對它們所分配的物件使用拷貝初始化.point global point foo bar point arg 第1處 第4,5初 return heap 第6處 ...

C primer學習 拷貝控制 3

strblob const strblob rhs 拷貝初始化 strblob operator const strblob rhs 練習 定義乙個使用引用計數的hasptr類class hasptr 在拷貝建構函式中定義三個成員,並且初始化引用計數為1 hasptr const hasptr h ...