Effective C++學習第四天

條款11:在operator=中處理自我賦值的現象

? ? ? ? ? ?雖然我們在平時可能不會出現顯示自我賦值的現象,當加入指針或者引用時,可能會出現不同的指針或引用指向同一對象(對象的不同別名),這時候我們就得考慮對象是否是同一個;考慮到要保證系統的自我賦值安全性和異常安全性的角度,可以采用的方案是:將原來的被賦值對象做一個副本,然后讓被賦值對象指向復制對象,最后刪除副本即可,代碼如下:

? ? ? ? widget& widget::operator=(const widget & rhs){

? ? ? ? ? ? ? ? ? ? bitmap *porig=pb;? ? ? ? ? ? ? ? ? ? ? ? ? //pb為類widget的一個類型為bitmap的指針

? ? ? ? ? ? ? ? ? ? pb=new? bitmap(*rhs.pb);

? ? ? ? ? ? ? ? ? ? delete porig;

? ? ? ? ? ? ? ? ? ? return *this;

? ? ? ? ? }

? ? ? ? ? ?最好的方法是采用copy and swap的方案,代碼如下:(方案1采用傳引用的方法,方案2采用傳值的方法

? ? ? ?void swap(widget &rhs)? {....};? ? //交換rhs和*this的數據;

? ? 方案1: widget &widget::operator=(const widget & rhs){? ? ? ? ? ? ? 方案2: widget&widget::operator=(widget rhs)

? ? ? ? ? ? ? ? ? ? widget temp(rhs);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {? ?

? ? ? ? ? ? ? ? ? ? swap(temp);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?swap(rhs);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

? ? ? ? ? ? ? ? ? ?return *this;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return *this;

? ? ? }? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }

條款12:復制對象時勿忘其每個成分

? ? ? ? ? 當自己定義copy函數時(copy構造和copy assignment),編譯器不再給我們提供新的copy函數,因此在拷貝的過程中,我們要確定所有的成員變量都被拷貝;

? ? ? ? ? 當我們為class增添新的成員變量時,我們需要修改我們所有的copy函數,構造函數,采用繼承的方式可以避免代碼的過多修改,但是你必須保證base class的成員變量也被初始化,也就是在derived class的拷貝函數初始化列表或者函數體中調用base class的拷貝函數;如果不這樣做,derived class在構造copy函數的時候會調用base class的default copy函數,但是base class的copy函數是被阻止的,因此此時編譯器會報錯;

? ? ? ? ?結論:當我們寫一個自定義的copy函數的時候,確定幾點:1)復制所有的local成員變量;2)調用所有base class內適當的copy函數;

? ? ? ? ? ? 不要令copy assignment去調用copy構造函數;也不要讓copy構造函數去調用copy assignment;

? ? ? ? ? ?當copy assignment和copy 構造函數有相近的代碼時,可以把相同的代碼變成新的成員函數,這樣的函數通常為private且常命名為init;

條款13:以對象管理資源

? ? ? ? ? ? ?以singleton(單例模式)的factory function為例,函數返回的是一個heap-base的指針,用戶在使用完這個對象之后需要把這個指針刪除,如何保證這個指針所指向的資源被刪除呢?可選用的方法是把:把資源放進對象中,利用C++的“析構函數自動調用機制”保證資源被釋放;

? ? ? ? ? ? ?C++標準程序庫中提供auto_ptr(類指針對象,也稱為智能指針),其析構函數自動對其所指對象調用delete,常見的智能指針有unique_ptr,shared_ptr;weak_ptr;

? ? ? ? ? ? 以對象管理資源的兩個關鍵想法:1)獲得資源后立刻放進管理對象內,實際上“以對象管理資源”的觀念通常被稱為“資源取得時機便是初始化時間(resource acquisition isinitialization RAII)”;2)管理對象運用析構函數確保資源被釋放(在析構函數釋放資源時,可能會出現異常,正確處理析構函數中拋出異常的情況);

? ? ? ? ? ? auto_ptr的特性是被銷毀(調用copy函數時會發生)時自動刪除它的所指之物,并將自己的指針指向nullptr,因此不要讓對個auto_ptr指向同一個對象,如果這樣可能會出現對象被刪除一次以上;auto_ptr的性質是始終只有一個指針取得資源的唯一擁有權;

? ? ? ? ? auto_ptr的替代方案是:引用型計數指針(reference-counting smart pointer,RCSP),該指針特性就是持續追蹤多個指針指向同一資源,并在無人指向該資源時釋放資源,但是RCSP無法打破環形引用(也就是類中互相指向的問題,可用weak_ptr來解決這一現象);

? ? ? ? ?由于以對象管理資源在析構函數中執行的是delete而非delete[],因此動態分配的數組無法通過這種方式來實現內存釋放,只能通過自己手工釋放內存資源;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/382393.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/382393.shtml
英文地址,請注明出處:http://en.pswp.cn/news/382393.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Effective C++學習第五天

條款14:在資源管理類中小心copy行為當我們深入理解“資源取得時機是初始化時機(RAII)”概念,并以此作為“資源管理類”的核心時,我們可能會遇到將RAII對象復制的情況,一般有兩種情況處理這個現象&#xff1…

Redis運維和開發學習筆記(2) redis持久化

Redis運維和開發學習筆記(2) redis持久化 文章目錄Redis運維和開發學習筆記(2) redis持久化持久化持久化方式一:RDB觸發~~的三種~~方式1. save命令2. bgsave配置觸發機制RDB 總結持久化方式二:AOFAOF的三種策略三種策略的優缺點AOF重寫機制持久化 redis將所有數據保存在內存中&…

Effective C++學習第六天

條款18:讓接口更容易被正確使用,不易被誤用設計接口的原則:正確性、高效性、封裝性、維護性、延展性以及協議的一致性;設計原則:1)導入新類型來預防很多客戶端的錯誤,多使用系統類型&#xff08…

Redis運維和開發學習筆記(4) Redis參數意義

Redis運維和開發學習筆記(4) Redis參數意義 文章目錄Redis運維和開發學習筆記(4) Redis參數意義參數意義參數意義 Client連接 問題 id567800790 addr10.18.17.217:37310 fd1572 name age2039114 idle2034860 flagsN db0 sub0 psub0 multi-1 qbuf0 qbuf-free0 obl0 oll0 omem0 …

Effective C++學習第七天

條款23:寧以non-memeber、non-friend替換member函數non-member/non-friend可以給對象帶來更大的封裝性,從兩個方面來考慮:1)考慮封裝,越多東西被封裝,它們就越不可見,就越少人看到它&#xff0c…

Redis運維和開發學習筆記(5) 主從復制和sentinel哨兵模式

Redis運維和開發學習筆記(5) 主從復制和sentinel哨兵模式 主從復制 將主節點的數據改變同步給從節點 作用 備份數據讀寫分離 存在的問題: 手動干預切主等操作主節點的寫能力受到單機限制主節點的存儲能力受到單機限制 主從模式的故障恢復 當主節點發生故障時&am…

Effective C++學習第八天

條款26:盡可能延后變量定義式的出現時間當你定義了一個變量,如果在使用變量之前出現異常,那么你得承受一次構造成本和析構成本,而且你沒有使用該變量;本條款給出的建議是延遲變量的定義,直到非得使用該變量…

Redis運維和開發學習筆記(6) 監控Redis工作狀態-info命令

Redis運維和開發學習筆記(6) 監控Redis工作狀態-info命令 文章目錄Redis運維和開發學習筆記(6) 監控Redis工作狀態-info命令info serverinfo clientinfo memoryinfo persistenceinfo statsinfo commandstatsinfo cpuinfo clusterinfo keyspaceinfo server Redis服務器相關的通用…

Effective C++學習第九天

條款32:確定你的public繼承塑模出is-a模型class D(derived)以public形式繼承class B(base),則每一個類型為D的對象同時也是一個類型為B的對象,反之不成立,因此B比D表現出更加一般化的…

Effective C++學習第十天

條款36:絕不重新定義繼承而來的non-virtual函數non-virtual函數執行的是靜態綁定,在編譯器就已經決定,因此對象對用的函數只和指針的類型有關,而與指針所指的對象無關;記住non-virtual函數的性質:不變性凌駕…

Redis運維和開發學習筆記(7) 內存管理和過期策略

Redis運維和開發學習筆記(7) 內存管理和過期策略 文章目錄Redis運維和開發學習筆記(7) 內存管理和過期策略內存回收策略惰性刪除定時任務刪除maxmemory過期策略allkeys-lru主從搭建測試搭建完畢主從測試結果volatile-lru測試結果volatile-ttl測試結果allkeys-lru內存回收策略 …

Effective C++學習第十一天

條款41:了解隱式接口和編譯期多態面向對象編程世界總是以顯式接口(源碼可見的接口)和運行期多態(virtual)解決問題;對于templates及泛型編程的世界,隱式接口和編譯期多態顯得更加重要&#xff1…

Redis源碼分析(零)學習路徑筆記

文章目錄第一階段第二階段 熟悉Redis的內存編碼結構第三階段 熟悉Redis數據類型的實現第四階段 熟悉Redis數據庫的實現第五階段 熟悉客戶端和服務器端的代碼實現第六階段 這一階段主要是熟悉Redis多機部分的代碼實現關于測試方面的文件有一些工具類的文件如下SORT命令的實現一些…

Effective C++學習第十二天

條款47:請使用traits classes表現類型信息STL有五類迭代器分類,input迭代器(只讀,一次,向前)、output迭代器(可寫,一次,向前)、forward迭代器(讀/…

Redis源碼分析(一)redis.c //redis-server.c

Redis源碼分析(一)redis.c //redis-server.c 入口函數 int main() 4450 int main(int argc, char **argv) {4451 initServerConfig();4452 if (argc 2) {4453 ResetServerSaveParams();4454 loadServerConfig(argv[1]);4455 …

Linux 學習

1.linux文本命令行語言環境設置命令 查看當前語言環境: echo ¥LANG 修改: LANG選擇的語言環境’ 引申:https://blog.csdn.net/huoyunshen88/article/details/41113633 2.linux中的硬鏈接和軟連接 linux中文件的儲存方式&#xf…

vivo C/C++工程師視頻面試總結 20180802

1.自我介紹:有點兒緊張了,直接把自己簡歷上的一些信息信息說了一遍,說完之后在介紹了一下自己的平時的愛好和興趣,感覺面試官沒有理我,直接進入下一環節了。 2.項目詳情:主要是自己最近的一個項目和自己負…

Redis源碼分析(二)redis-cli.c

文章目錄1. int main()2. parseOptions(int argc, char **argv) 進行ip和port的改變3. lookupCommand(char *name) 查找命令,判斷命令合法3.2 strcasecmp(name,cmdTable[j].name)3.1 redisCommand cmdTable[]4. cliSendCommand(int argc, char **argv)4.1 cliConnec…

C語言中有bool變量嗎?

1.C/C中定義的數據類型: C語言中定義了6種基本數據類型:short,int,long,float,double,char 4種構造類型:數組,結構體(struct),共用類型(union),枚舉類型(enum) 指針類型和空類型 C語…

redis源碼剖析(三)——基礎數據結構

文章目錄SDS鏈表字典這篇文章關于 Redis 的基礎數據:SDS SDS (Simple Dynamic String)是 Redis 最基礎的數據結構。直譯過來就是”簡單的動態字符串“。Redis 自己實現了一個動態的字符串,而不是直接使用了 C 語言中的字符串。 sds 的數據結…