2014-08-27 36 views
2

我有一類這樣的:常量參數和C++中const的方法

class MyClass 
{ 
    const int GetValue() 
    { 
     return 2; 
    } 
} 

,我把它傳遞給一個函數是這樣的:

void Test(const MyClass &myClass) 
{ 
    int x=myClass.GetValue(); 
} 

但我收到此錯誤:

The object has type qualifiers that are not compatible with member function Object type is const MyClass 

我知道,如果我定義函數是這樣的:

void Test(MyClass &myClass) 

但我想知道爲什麼加入常量應該產生這樣的錯誤?

回答

1

您可以設置INT爲const,嘗試使該方法常量像這樣:

const int GetValue() const 
{ 
    return 2; 
} 
+4

它一般不返回一個'const'值(儘管它並不真正的問題一個簡單的類型,比如'int')一個好主意。 – 2014-08-27 13:37:49

+0

@MikeSeymour:有趣的一點。爲什麼? – Jepessen 2014-08-27 13:42:11

+3

@Jepessen:因爲它禁止移動語義:'const'返回值不能移出,所以'x = const_thing()'需要一個副本。對int不是問題,但如果你返回一個大的數據結構可能會導致性能問題。 – 2014-08-27 13:44:47

8

你需要做的成員函數const,而不是返回類型:

int GetValue() const; 

這使得可以通過const實例(或通過const引用或指針)調用此成員。

注:如你是價值迴歸,你回到事物的常量性被阻止返回它的對象的常量性分離。實際上,您希望返回類型不可能是const

1

存在兩個問題,一個可見性問題(您的const int GetValue()函數因私人而不可見)以及您調用非const函數的事實(它可以對其作爲成員函數進行修改的對象)

const int GetValue() 

從恆定參考類

const MyClass &myClass 

你基本上要求「這個對象不得修改,反正讓我調用一個函數,它不保證本「。

你並不一致。

+0

不,使用const值初始化非const拷貝不是問題 - 這是一個非常合理的事情。問題是在一個const對象上調用一個非const成員函數。 – 2014-08-27 13:39:52

+0

Brainfart,反正也是一個可見性問題。編輯,謝謝 – 2014-08-27 13:44:45