const正确性和成员参考

时间:2017-12-04 09:53:51

标签: c++ const

我有以下课程:

class DataBuilder
{
public:
    DataBuilder(Data& data): data_(data){}

    //Fun modify data_, uses private methods
    void Fun(std::string name, int id) //const ?
    { 
        //calculate newInfo based on params (uses private methods)
        auto& info = data_.GetInfo();
        info = newInfo;
    }
private:
    //some private methods
    Data& data_;
};

理论上有趣可以是 const ,但我想知道它是否正确(逻辑常量)?

Edit1 我添加了一个非常简化的Fun实现。 Edit2 数据有两个GetInfo重载:

Info& Data::GetInfo();
const Info& Data::GetInfo() const;

2 个答案:

答案 0 :(得分:5)

在此上下文中,

const表示“不修改对象”,这是通过将隐式this视为指向const的指针来强制执行的。出于这个原因,通常会看到像

这样的重载
Data       & getData();
Data const & getData() const;

这会保留调用上下文的const,并允许在非const上下文中调用时修改Data

在你的情况下,你没有Info & Data::getInfo const;(这可能是相当可疑的,const Data从哪里得到非const Info?{{1} }正在修改Fun的{​​{1}}成员。

除了: 我会将作业写为data_

答案 1 :(得分:2)

Fun正在操纵数据。因此 应该无法声明const。您 能够做到这一点的事实显然,data.GetInfo被声明为const,但返回一个引用,通过该引用可以操纵它的内部状态。这是糟糕的编程。

所以不,这不正确。即使在理论上,Fun也不应该const,因为它不是const。它正在操纵内部状态。它可能的事实是由于编码错误。修复它。 List[Nothing] - 正确是半心半意的事情。你做到了,或者你没有。