常數成員函數
回答
是的,應該總是使用const
。
它讓你的編譯器檢查你的應用程序邏輯,靜態斷言const-correctness是免費的!
有人甚至認爲const
應該是默認值,並且您應該被迫使用mutable
來表示非常數。
我廣泛使用const來傳達設計意圖。如果我打算一個方法是一個純粹的查詢,而不是修改函數,那麼我會強制執行該方法並在簽名中使用'const'進行通信。
我鼓勵你看看梅耶關於無副作用函數問題的想法,以及對啓用測試的影響。
將const
添加到成員函數允許它在一個對象的const引用上被調用,因爲它保證實例變量不會被改變。 const引用出現在整個STL的各個位置,所以在函數不打算修改對象狀態的地方將成員函數標記爲const是有意義的。
注意:可以將某些實例變量標記爲mutable
,以便即使通過const函數也可以更改它們。例如,這對於實現查找緩存非常有用。
聲明是不應該修改成員變量的方法:
- 保證,你認爲什麼是正在發生的事情,即你沒有意外修改變量的地方。
- 向函數的調用者聲明此方法不會修改成員變量,不需要閱讀代碼或依賴於說明如此的文檔。
所以是的,只要有意義,請使用const
。他們沒有像我希望看到的那樣廣泛使用,很可能是因爲大多數開發人員沒有看到巨大的收益。
如果您忘記將訪問器標記爲const
,則編譯器將不允許在const
對象上調用該方法或對const
對象的引用進行調用。所以是的,標記訪問器爲const
是重要。
如果您有一個類對象的const引用或指針(即指向const的指針),那麼您只能調用該類的const成員方法。因此,如果某人「忘記」製作一個「get」方法const,那麼您將無法使用const引用來調用它(const_cast有一個解決方法,但我們不想使用它!)。
所以是的,如果該類不會被該方法修改,那麼它應該是const。
注意:有些情況下,您確實想要將變量修改爲「實現細節」,例如延遲加載或鎖定互斥鎖。在這種情況下,您仍然可以使該方法爲const,但將該成員變量設置爲「mutable」。
如果你正在編寫一個虛擬方法,它應該是const,如果沒有派生類需要它是可變的。
您應儘可能使用const關鍵字。
它防止你從代碼中的錯誤。
它增加了代碼的可讀性。 大家誰是閱讀的頭,看到常量的關鍵字可以立即明白,一個const方法不改變對象的狀態,並可以在不害怕他會改變的對象,例如
只是我的證詞中使用。
若干年前,我還是反對使用const,因爲在設計和書寫較長的函數簽名...等的限制只是...
但我的項目領導人之一始終堅持,一直提醒着我:「你應該使用const函數,它避免了事故和無意義」。
而且有一天我遇到了不可能找不到。幾天之後的日子......一場噩夢。這個設計對我來說太大了,因爲我能夠把握它的整體。我徒勞地搜尋,直到我決定我迷路了。
然後,我花了兩天重新定義所有的功能應該是const。我的意思是,兩天。 (重新編譯只要是一個500萬行的代碼項目)。
然後:只是我發現了錯誤...而是編譯器找到了我的錯誤:在類似getter的方法中,應該給我gui控件的首選大小,代碼實際上是計算大小,但它也緩存其大小和更新其大小...因此修改對象。
現在,有時我忘了把常量。但如果我注意到它,我會糾正它。
- 1. 成員函數
- 2. 成員函數
- 3. 靜態成員數組成員函數
- 4. 尋找成員函數的常量
- 5. 類的成員函數改變類成員常量
- 6. 傳遞成員函數作爲成員函數的參數
- 7. 從成員函數模板參數調用成員函數
- 8. 成員函數行
- 9. 成員函數和
- 10. const成員函數
- 11. Constexpr成員函數
- 12. 在成員函數
- 13. const成員函數Vs的常量友元函數
- 14. 靜態函數常量靜態成員函數
- 15. 成員函數指針,傳遞函數作爲非成員函數的參數
- 16. 基類成員函數直接訪問子類成員函數?
- 17. C++分配成員的目標函數,類成員函數
- 18. 從const成員函數調用非const成員函數
- 19. 運算符重載:成員函數與非成員函數?
- 20. 使用其他成員函數的C++成員函數
- 21. 從不同的類成員函數調用成員函數
- 22. 調用從const成員函數非const成員函數指針
- 23. 成員函數和const成員函數指針扣
- 24. 用於重載成員函數的成員函數指針
- 25. 如何通過成員函數指針調用成員函數?
- 26. 函數或方法或函數成員或方法成員?
- 27. 成員函數的訪問函數成員變量
- 28. 成員函數返回指向成員函數的指針
- 29. 從另一個成員函數調用成員函數在JavaScript
- 30. 作爲成員函數和非成員函數的運算符函數
另外,你可以在函數的`const`限定符上重載函數。例如,這允許一個索引操作符,如果該對象被聲明爲`const`,它將自動以只讀*方式返回該元素。 [*只讀仍然只適用於編譯時,但。 `const`在運行時不能做任何事情] – Mephane 2011-01-14 13:13:46
+1對於const正確性。沒有人提到它 – 2011-01-14 13:15:15
我在考慮你的陳述「const作爲默認值,並且可變爲非常量」。看起來像一個極端的位置,但我會嘗試去感受我的想法。 – 2011-01-14 13:32:23