2011-01-14 72 views
8

在閱讀this之後,我的理解是將方法聲明爲const可以防止它意外修改類的成員變量。常數成員函數

  • const方法常用?
  • 它們應該用於什麼都不應該修改成員變量

回答

14

是的,應該總是使用const

它讓你的編譯器檢查你的應用程序邏輯,靜態斷言const-correctness是免費的!

有人甚至認爲const應該是默認值,並且您應該被迫使用mutable來表示非常數。

+1

另外,你可以在函數的`const`限定符上重載函數。例如,這允許一個索引操作符,如果該對象被聲明爲`const`,它將自動以只讀*方式返回該元素。 [*只讀仍然只適用於編譯時,但。 `const`在運行時不能做任何事情] – Mephane 2011-01-14 13:13:46

+0

+1對於const正確性。沒有人提到它 – 2011-01-14 13:15:15

+0

我在考慮你的陳述「const作爲默認值,並且可變爲非常量」。看起來像一個極端的位置,但我會嘗試去感受我的想法。 – 2011-01-14 13:32:23

6

我廣泛使用const來傳達設計意圖。如果我打算一個方法是一個純粹的查詢,而不是修改函數,那麼我會強制執行該方法並在簽名中使用'const'進行通信。

我鼓勵你看看梅耶關於無副作用函數問題的想法,以及對啓用測試的影響。

1

const添加到成員函數允許它在一個對象的const引用上被調用,因爲它保證實例變量不會被改變。 const引用出現在整個STL的各個位置,所以在函數不打算修改對象狀態的地方將成員函數標記爲const是有意義的。

注意:可以將某些實例變量標記爲mutable,以便即使通過const函數也可以更改它們。例如,這對於實現查找緩存非常有用。

1

聲明是不應該修改成員變量的方法:

  1. 保證,你認爲什麼是正在發生的事情,即你沒有意外修改變量的地方。
  2. 向函數的調用者聲明此方法不會修改成員變量,不需要閱讀代碼或依賴於說明如此的文檔。

所以是的,只要有意義,請使用const。他們沒有像我希望看到的那樣廣泛使用,很可能是因爲大多數開發人員沒有看到巨大的收益。

1

如果您忘記將訪問器標記爲const,則編譯器將不允許在const對象上調用該方法或對const對象的引用進行調用。所以是的,標記訪問器爲const重要。

1

如果您有一個類對象的const引用或指針(即指向const的指針),那麼您只能調用該類的const成員方法。因此,如果某人「忘記」製作一個「get」方法const,那麼您將無法使用const引用來調用它(const_cast有一個解決方法,但我們不想使用它!)。

所以是的,如果該類不會被該方法修改,那麼它應該是const。

注意:有些情況下,您確實想要將變量修改爲「實現細節」,例如延遲加載或鎖定互斥鎖。在這種情況下,您仍然可以使該方法爲const,但將該成員變量設置爲「mutable」。

如果你正在編寫一個虛擬方法,它應該是const,如果沒有派生類需要它是可變的。

1

您應儘可能使用const關鍵字。

它防止你從代碼中的錯誤。

它增加了代碼的可讀性。 大家誰是閱讀的頭,看到常量的關鍵字可以立即明白,一個const方法不改變對象的狀態,並可以在不害怕他會改變的對象,例如

4

只是我的證詞中使用。

若干年前,我還是反對使用const,因爲在設計和書寫較長的函數簽名...等的限制只是...

但我的項目領導人之一始終堅持,一直提醒着我:「你應該使用const函數,它避免了事故和無意義」。

而且有一天我遇到了不可能找不到。幾天之後的日子......一場噩夢。這個設計對我來說太大了,因爲我能夠把握它的整體。我徒勞地搜尋,直到我決定我迷路了。

然後,我花了兩天重新定義所有的功能應該是const。我的意思是,兩天。 (重新編譯只要是一個500萬行的代碼項目)。

然後:只是我發現了錯誤...而是編譯器找到了我的錯誤:在類似getter的方法中,應該給我gui控件的首選大小,代碼實際上是計算大小,但它也緩存其大小和更新其大小...因此修改對象。

現在,有時我忘了把常量。但如果我注意到它,我會糾正它。