你覺得它有幫助嗎?你經常聲明你的函數是const嗎?
回答
每次你知道該方法不會改變對象的狀態時,你應該聲明它是不變的。
它有助於閱讀您的代碼。當你試圖改變對象的狀態時它會有所幫助 - 編譯器會阻止你。
如果函數甚至沒有觸及對象狀態,而只是將輸入參數轉換爲返回值,那麼它應該是靜態的。靜態>常量成員>普通成員。 – Lucas 2010-03-11 00:04:43
如果您有const
對象,則編譯器允許您調用的唯一方法是那些由const
關鍵字標記爲安全的方法。實際上,只有成員方法纔有意義,如const
方法。
在C++中,對象的每種方法都會收到指向對象的隱式指針this
;一個const
方法將簡單地收到一個const
this
指針。
假設你正在談論方法,如:
struct Example {
void f() const;
};
當然,如果他們應該是一個const對象上調用,該方法應該是常數。
儘可能經常。不需要更改數據成員的函數應該聲明爲const。這使代碼更易於理解,並可能會提示編譯器進行優化。
不經常不夠....
雖然所有的答案是正確的,如果你使用的是libary不是const correct話,就很難使用常量你應該使用它的地方。
如果你有一箇舊的API,需要一個的char *,對於所有邏輯的目的應該是爲const char *,那麼你要麼必須忘記常量在你的代碼或者做一些醜陋的鑄造。在那種情況下,我忘記了const。
另一種方法是封裝API並確定它是否真的應該花費成本數據,如果是這樣,則在您的包裝器中丟棄輸入數據的常量。這意味着你只需要醜陋的鑄造一次,你可以評論你通過你的測試確定這是安全和正確的事實等。恕我直言,大多數,如果不是所有'舊的API'應該被包裝... – 2010-03-10 07:37:18
我曾經把函數聲明爲const,但現在我很少再做它了。
主要問題是,如果我想將一個函數從const更改爲非const,則意味着調用該函數的所有其他const函數也需要更改爲非const。
由於優化,發生的次數比我想象的要多。例如,我有一個GetData()函數,它用於返回一個指向數據的指針,但後來我進行了優化,只在GetData()最終被調用時才設置數據(這會更改對象的狀態,所以它不再是一個常量功能)。
同樣的事情可以做一些計算而不改變對象的狀態,但在某些時候更有意義的緩存結果,因爲該函數被調用很多次,並且是一個瓶頸。
另外在實踐中,至少對於我的項目,我看到將我的函數聲明爲const的好處很少。
功能哪不改變「邏輯值」仍然可以是const,你只需要爲你的緩存使用可變數據成員。 – 2010-03-10 07:58:01
是的,同意羅傑的評論。聲明爲mutable的數據成員可以在const函數內進行更改。 – jasonline 2010-03-10 08:08:18
我在幾乎每一個機會都使用const,並且就像它提供了兩個意向文檔並強制符合該意圖。語言特徵並沒有比這更好,然而const好奇地不受歡迎。(現實情況似乎是,大多數自稱爲C++程序員不能解釋int*, int*const, const int*
和const int*const
之間的區別。)
雖然它可能永遠不會發生,因爲它「C」的起源,我常常想,C++會如果const是默認值,並且需要(比如說)'var'或一些類似的關鍵字以允許在構建後修改變量,那麼將其作爲更好的語言。
- 1. 你可以在VBScript中聲明一個常量數組嗎?
- 2. 你可以結合CSS聲明嗎?
- 3. 你能解釋一下這個奇怪的函數聲明行爲嗎?
- 4. 爲什麼你不能調用括號內聲明的函數?
- 5. 如何聲明extern(「C」)const函數?
- 6. 你是否只需要調用聲明和原型聲明「聲明」?
- 7. 你可以將一個DataTable聲明爲一個數組嗎?
- 8. 在ColdFusion 8中,你可以使用cfscript聲明一個函數爲private嗎?
- 9. 你能像這樣在ASP經典中聲明一個變量嗎?
- 10. 你可以聲明一個可變長度的泛型類型聲明嗎?
- 11. 在什麼情況下你會聲明一個非引用,非指針類型的函數參數const?
- 12. 你可以聲明Angular 2中的Attribute指令的順序嗎?
- 13. 你生成你的數據字典嗎?
- 14. 爲什麼你不能在Ruby的方法中聲明常量?
- 15. 經常性聲明c
- 16. 你曾經對你自己的Forked repo做過pull request嗎?
- 17. 找不到'Track'的超類'Object'的接口聲明;你的意思是'NSObject'嗎?
- 18. 使用未聲明的標識符'nothrow';你的意思是'扔'嗎?內存
- 19. 使用未聲明的標識符'top';你的意思是'流行'嗎?
- 20. 你如何聲明班級內聯?
- 21. 你如何閱讀C聲明?
- 22. 你可以改變Twilio的聲音嗎?
- 23. 當你調用成員函數時,你可以調用friend函數嗎?
- 24. C#:你如何管理項目中的符號常量?你在哪裏聲明解決方案範圍常量?
- 25. 你能解釋一下這個枚舉聲明嗎?
- 26. 你可以在WebBrowser中聲明一個InputScope嗎?
- 27. 你可以在C++中聲明一個指針作爲extern嗎?
- 28. 你可以在堆上聲明一個指針嗎?
- 29. const結構聲明
- 30. 你可以在iPhone上使用C open(const char * name,int flag)函數嗎?
不斷! (對不起,不由自主) – Thilo 2010-03-10 07:24:11