2016-10-01 100 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