常量正确性和成员参考

const correctness and member reference

本文关键字:参考 成员 正确性 常量      更新时间:2023-10-16

我有以下类:

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_;
};

从理论上讲,乐趣可以是常量,但我想知道它是否正确(逻辑恒定性)?

编辑1我添加了一个非常简化的 Fun 实现。编辑2数据有两个 GetInfo 重载:

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

在此上下文中const表示"不修改对象",这是通过将隐式this视为指向常量的指针来强制执行的。出于这个原因,通常会看到像这样的重载

Data       & getData();
Data const & getData() const;

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

在您的情况下,您没有Info & Data::getInfo const;(这将是相当可疑的,constData从哪里获得非 constInfoFun正在修改DataBuilderdata_成员。

旁白: 我会把作业写成data.GetInfo() = newInfo;

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

所以不,这是不正确的。即使在理论上,Fun也不应该被const,因为它不是。它是在操纵内部状态。事实上,这可能是由于编码错误。修复它。const- 正确性是不能三心二意的事情。你做,或者你不做。