2016-10-01 95 views
2

在類方法中應使用const關鍵字來指示調用對象未被此方法修改。但是後者的確切語義是什麼?我能想到的三個選項:A類方法應該是const當且僅當哪些方法應該是const?

  1. (最弱)不修改對象的商店的比特和字節
  2. (強)不修改對象(如在1),並且也沒有其由對象所擁有的被引用對象
  3. (最強)它不改變由它引用的對象,並且還沒有任何對象(無論是擁有或不)

什麼是「正確」方式?編程界有沒有共同的想法?

例如,標準庫的容器const語義顯然至少滿足2個。另一方面,奇怪的是,std :: unique_ptr的* -operator甚至不滿足2:它是const,但是返回一個非const引用指向的對象,雖然對象擁有的是std :: unique_ptr對象根據定義。

又如:

class X 
{ 
private: 
    int& intref; 

public: 
    X(int& intref): intref(intref) {}; 

    void modifyRef(int& another) const 
    { 
     this->intref = another; 
    } 
}; 

繼2,關於方法的常量是確定的,因爲INTREF引用一些東西,不是由對象所擁有。在3之後,const應該被刪除。

+1

「的const關鍵字應該在類的方法被用來指示該方法不會修改調用對象。「 - ***錯誤***。它表示***被調用的***對象沒有被這個方法修改。 –

+0

我會再向下一級,0(邏輯常量)你在哪裏不透明地修改對象狀態。 – gjha

+0

@gjha這不是一個級別,而是一個側面。 – Deduplicator

回答

2

這三者中都沒有。

記住,C++ const意味着邏輯恆定,不物理恆定。

當然,只有在對象聲明爲常量的情況下,您纔可以修改mutable成員,但除此之外,您只需保留邏輯狀態。

那麼,你的方法是否改變了對象的邏輯狀態?

+0

我很尷尬地承認,我不記得C++ const意味着邏輯常量,因爲我以前不知道。但我明白這一點。我認爲我之前已經以直覺的方式使用過它,然後當我試圖建立在方法上使用const的規則時(這導致了上面的3點),我感到困惑。我將進一步閱讀有關邏輯常量的內容,並感謝所有建議。 –

+0

對類方法的const是否主要針對公共方法,或者是否也應該用於私有方法? –

+0

如果你始終不是const正確的,它將不起作用。所以,也爲私人方法做。 – Deduplicator

1

級別0(邏輯常量)您可以在哪裏允許不透明地修改對象狀態。

考慮一個Cache類的例子,它有一個find()方法,它在局部映射中找到一個元素,在本地映射中找不到它繼續前進,在數據庫中搜索......等等,最後更新它帶檢索值的本地地圖。

這裏find()方法在Cache類可以是const,它會給類的更乾淨的接口。類的用戶不會受到元素檢索的內部機制的困擾。

您提供不滿足logical const-ness