2014-10-02 28 views
0

我有以下方法的類:我是否總是必須聲明任何不影響實例狀態的方法,因爲const?

int getLength() { 
    return length; 
} 

(類被稱爲String,我定義它的做法)。

當我試圖編譯,我得到了關於一行代碼調用此方法的錯誤:

passing 'const String' as 'this' argument of int String::getLength() discards qualifiers. 

在這個網站一搜索讓我意識到我需要在方法聲明中添加const。它解決了這個問題。

我的問題:

總是我必須聲明,不影響實例的狀態的任何方法,如const?如果我沒有,我得到一個編譯時錯誤?看起來很奇怪。

如果我不必總是這樣做,那麼比我需要將方法聲明爲const時的情況是什麼?

+0

如果您發佈錯誤消息,最好也發佈錯誤消息所引用的源代碼行(+上下文)。如您已經說過的,錯誤不會發生,因爲您*聲明*該方法爲非常量,但因爲*在非const對象/引用上使用它*。 – misberner 2014-10-02 23:50:52

回答

4

編譯器錯誤不是由方法引起的,而是由您調用它的實例的類型引起的。您嘗試在const對象(const String)或對const對象(const String&)的引用上調用非const方法。這被編譯器正確拒絕。

而且,是的,您應該將邏輯上爲const的所有方法標記爲const

+0

哦,我明白了。的確,我在'const String&'對象上調用了這個方法。謝謝 – 2014-10-02 23:53:38

+0

@AvivCohn:該陳述不正確。對象從不參考。你正在對'const String'類型的值(特別是一個左值)調用methond,大概是通過評估一個引用變量或者一個右值來獲得的。 – 2014-10-03 00:01:14

相關問題