日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ Primer 5th笔记(chap 13 拷贝控制)交换操作

發布時間:2025/3/21 c/c++ 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ Primer 5th笔记(chap 13 拷贝控制)交换操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 類對象的交換賦值

Hasptr.h

class Hasptr { public: Hasptr(const std::string &s = std::string()):ps(new std::string(s),i(0),use(new std::size_t(1))) {} Hasptr(const Hasptr &p):ps(p.ps),i(p.i),use(p.use){++*use}; Hasptr& operator=(const Hasptr&);~Hasptr(); private:std::string *ps;int i;std::size_t *use; }

交換代碼為:

Hasptr temp = v1; //創建v1的一個臨時副本 v1 = v2; //將v2賦值給v1 v2 =temp; //將保存v1的值賦予v2

2. 優化

在上面的交換過程中,需要一次拷貝和兩次賦值,string的內存分配帶來了開銷, 更希望 swap 交換指針,而不是分配 string 的新副本:

string &temp = v1.ps; v1.ps = v2.ps; v2.ps = temp.ps;

2. 1 可以在類上自定義一個版本的 swap,當交換兩個HasPtr對象時,只需要交換他們內部的指針即可:

class HasPtr{friend void swap(HasPtr &lhs,HasPtr &rhs); }inline swap(HasPtr&,HasPtr&) {using std::swap;swap(lhs.ps,rhs.ps); //交換指針,而不是string的數據swap(lhs.i;rhs.i); //交換int成員 }

2. 2 賦值運算符中使用 swap

使用拷貝并交換的技術,這種技術將左側運算對象與右側運算對象的一個副本進行交換。
rhs 是按值傳遞的:

HasPtr& HasPtr::operator=(HasPtr rhs) {//交換左側運算對象和局部變量rhs的內容swap(*this,rhs);return *this; //rhs 被銷毀,從而delete了rhs中的指針 }
  • 注:賦值運算符具備異常安全、且能正確處理自賦值。

【參考】
[1] 代碼referenceCountSwap.h

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的C++ Primer 5th笔记(chap 13 拷贝控制)交换操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。