2016-09-11 87 views
1

我有一個類中的功能與const關鍵字:const函數,但我可以「修改」類

bool Machiavelli::IsStraight(std::vector<Card>& cards) const{} 

馬基雅維利類有內部的其他類,如卡和表:

class Table{ 
    private: 
      std::map<int, std::vector<Card> > table; 
    .... 
}; 

該函數中的vector是一個向量table。功能檢查卡片是否直線組裝。

現在,在功能更改卡功能的數據的價值:

cards[i].SetIntValue(14); 

其中SetIntValue在卡類的功能。

讀了一些問題,我讀:一個函數聲明意味着

const

該功能是不允許更改任何類成員(除非被標記爲可變的)。

函數不知道參數是在Machiavelli中,所以我可以更改一個類成員:table。我的推理失敗了嗎?

+3

你可以請嘗試創建一個[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)並向我們展示? –

回答

7

聲明爲const的方法無法修改成員,只要它試圖通過implicit this pointer of the method修改它們即可。

考慮下面的類:

struct foo 
{ 
    void bar(int *i) const { 
     *i = 0; 
     _m = 0; 
    } 

    int j; 
    int _m; 
}; 

假設我們稱之爲

foo f; 
f.bar(&f.j); 

然後行

 *i = 0; 

是罰款。儘管它實際上修改了j,但它並沒有通過this來完成。然而,

 _m = 0; 

的真正含義

 this->_m = 0; 

,所以它不會建 - 函數的const意味着它不能對其進行修改。

2

因爲const函數不會更改類成員。

它正在改變作爲參數傳遞給函數的向量。

不管調用該函數是傳遞一個恰好是同一類的成員的矢量是一個完全不同的問題。

1

const函數聲明後表示該函數不允許更改任何類成員(除了標記爲mutable的類)。

這不完全正確。一個小而重要的修正是必要的。

const函數聲明之後意味着函數不允許改變任何數據經由其類成員變量(除經由那些被標記變)。

請注意,一個變量不是數據,它是一個名稱的數據。

由於cards不是類成​​員變量,有可能經由cards改變數據,即使它是在成員變量table坐在相同的數據。

相關問題