在C++中,如果非RAII類具有用戶定義的析構函數,那麼它是一個好設計嗎?非RAII類是否需要用戶定義的析構函數?
-1
A
回答
0
如果類不需要釋放任何資源(或執行任何操作),並且不需要爲虛擬函數表創建空的析構函數,那麼最好不要定義析構函數在所有(見零規則)。
1
有兩個常見的「經驗法則」涵蓋了這一點。
第一個是五法則(在C++ 03中,規則三,因爲沒有任何移動)。如果您有複製構造函數,複製賦值運算符,析構函數,移動構造函數或移動賦值運算符中的任何一個,則需要編寫或阻止其他每個運算符。
第二是規則零,其中指出,對於大多數類,不寫一個拷貝構造函數,拷貝賦值運算符,析構函數,構造運動或移動賦值操作符。相反,請將您的資源存儲在爲您處理該問題的特殊用途子對象中。
規則爲零可能是你所指的。
與大多數經驗法則一樣,這不是一條硬性規則,但它背後有智慧。一個工作是資源管理(你可能稱之爲RAII類)的類可以處理問題的來龍去脈,而不用關心其餘的邏輯,通常是以零開銷的方式做到這一點。然後你的外部類可以免除這種擔憂。由於資源壽命管理是一個不平凡的問題,將其與其他問題隔離並單獨進行測試可以幫助減少錯誤。但是,如果您的對象旨在從多態繼承,它通常需要一個虛擬析構函數。它應該也可以阻止賦值,複製構造(至少公開),移動構造,移動賦值和複製賦值,至於多態類,這些很少有意義,並且可能導致切片問題。
擁有用戶定義的析構函數的另一個原因是,如果你正在編寫一個範圍守護類,它往往不擁有任何資源。正確地執行一個範圍守衛類是棘手的(並且如果沒有新的C++異常展開檢測支持 - 基本上確定一個範圍守護類是否可以安全拋出幾乎是不可能的)。
相關問題
- 1. 如果基類析構函數是虛擬的,是否需要派生類析構函數定義?
- 2. 爲什麼用戶定義的析構函數的插入需要一個用戶定義的複製構造
- 3. 是否需要定義來自不同類的移動構造函數?
- 4. 用戶定義的類構造函數和函數不起作用,我構建了我的類是否錯誤?
- 5. CoffeeScript是否有類析構函數?
- 6. VB6類是否具有析構函數?
- 7. 一個類是否需要Typescript中的構造函數?
- 8. 派生類是否總是需要調用默認的基礎構造函數?
- 9. 是否需要調用std構造函數的調用?
- 10. 爲什麼我需要定義自定義構造函數?
- 11. 虛擬析構函數 - 有需要時
- 12. 對構造函數和析構函數的未定義引用
- 13. Esper用戶定義的函數,需要兩個參數
- 14. 類中的方法(而不是構造函數)是否需要參數?
- 15. 內部類的默認構造函數是否需要外部類的對象?
- 16. 析構函數是否自動調用
- 17. 它是否違反了非缺省可constuctible結構的缺乏用戶定義構造函數的標準?
- 18. 命名空間範圍構造函數定義是否需要類限定標識符?
- 19. 我是否需要在析構函數中清理deque中的對象?
- 20. 我是否需要在自定義丟失函數中定義落後()?
- 21. 我是否需要在java中的類構造函數中定義所有的字段?
- 22. 客戶端使用WCF服務是否需要接口定義?
- 23. 我是否需要爲此構建自定義的UITableViewCell?
- 24. C++中總是需要調用基類構造函數嗎?
- 25. 我是否需要SDL的main()函數?
- 26. 是否支持非泛型類中的泛型構造函數?
- 27. 是否需要驗證函數參數?
- 28. 「已經定義的析構函數」與專門的析構函數
- 29. Collect2在類中的析構函數定義上的錯誤
- 30. 基類的構造函數和析構函數是否使用派生函數調用?
什麼是非RAII類? – juanchopanza 2014-10-29 13:21:22
好的,說RAII我是指類的主要目標是獲取和釋放資源。非RAII類是一個有其他目標的類。 – 2014-10-29 13:25:59
不知道我明白..你能用這樣的代碼做一個這樣的類的例子嗎? – 2014-10-29 13:26:57