2010-03-10 55 views

回答

24

每次你知道該方法不會改變對象的狀態時,你應該聲明它是不變的。

它有助於閱讀您的代碼。當你試圖改變對象的狀態時它會有所幫助 - 編譯器會阻止你。

+0

如果函數甚至沒有觸及對象狀態,而只是將輸入參數轉換爲返回值,那麼它應該是靜態的。靜態>常量成員>普通成員。 – Lucas 2010-03-11 00:04:43

6

如果您有const對象,則編譯器允許您調用的唯一方法是那些由const關鍵字標記爲安全的方法。實際上,只有成員方法纔有意義,如const方法。

在C++中,對象的每種方法都會收到指向對象的隱式指針this;一個const方法將簡單地收到一個constthis指針。

3

假設你正在談論方法,如:

struct Example { 
    void f() const; 
}; 

當然,如果他們應該是一個const對象上調用,該方法應該是常數。

11

儘可能經常。不需要更改數據成員的函數應該聲明爲const。這使代碼更易於理解,並可能會提示編譯器進行優化。

2

不經常不夠....

雖然所有的答案是正確的,如果你使用的是libary不是const correct話,就很難使用常量你應該使用它的地方。

如果你有一箇舊的API,需要一個的char *,對於所有邏輯的目的應該是爲const char *,那麼你要麼必須忘記常量在你的代碼或者做一些醜陋的鑄造。在那種情況下,我忘記了const。

+2

另一種方法是封裝API並確定它是否真的應該花費成本數據,如果是這樣,則在您的包裝器中丟棄輸入數據的常量。這意味着你只需要醜陋的鑄造一次,你可以評論你通過你的測試確定這是安全和正確的事實等。恕我直言,大多數,如果不是所有'舊的API'應該被包裝... – 2010-03-10 07:37:18

0

我曾經把函數聲明爲const,但現在我很少再做它了。

主要問題是,如果我想將一個函數從const更改爲非const,則意味着調用該函數的所有其他const函數也需要更改爲非const。

由於優化,發生的次數比我想象的要多。例如,我有一個GetData()函數,它用於返回一個指向數據的指針,但後來我進行了優化,只在GetData()最終被調用時才設置數據(這會更改對象的狀態,所以它不再是一個常量功能)。

同樣的事情可以做一些計算而不改變對象的狀態,但在某些時候更有意義的緩存結果,因爲該函數被調用很多次,並且是一個瓶頸。

另外在實踐中,至少對於我的項目,我看到將我的函數聲明爲const的好處很少。

+3

功能哪不改變「邏輯值」仍然可以是const,你只需要爲你的緩存使用可變數據成員。 – 2010-03-10 07:58:01

+0

是的,同意羅傑的評論。聲明爲mutable的數據成員可以在const函數內進行更改。 – jasonline 2010-03-10 08:08:18

1

我在幾乎每一個機會都使用const,並且就像它提供了兩個意向文檔並強制符合該意圖。語言特徵並沒有比這更好,然而const好奇地不受歡迎。(現實情況似乎是,大多數自稱爲C++程序員不能解釋int*, int*const, const int*const int*const之間的區別。)

雖然它可能永遠不會發生,因爲它「C」的起源,我常常想,C++會如果const是默認值,並且需要(比如說)'var'或一些類似的關鍵字以允許在構建後修改變量,那麼將其作爲更好的語言。

相關問題