常量正确性和成员参考
const correctness and member reference
我有以下类:
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
从哪里获得非 constInfo
?Fun
正在修改DataBuilder
的data_
成员。
旁白: 我会把作业写成data.GetInfo() = newInfo;
Fun
正在操作数据。所以它不应该被宣布为const
.您能够做到这一点的事实是,显然,data.GetInfo
被声明为const
,但返回一个引用,您可以通过该引用来操纵它的内部状态。这是糟糕的编程。
所以不,这是不正确的。即使在理论上,Fun
也不应该被const
,因为它不是。它是在操纵内部状态。事实上,这可能是由于编码错误。修复它。const
- 正确性是不能三心二意的事情。你做,或者你不做。
相关文章:
- C++错误消息*成员参考.**初学者*
- 当课程成员成员时,为什么参考会占据内存
- 参考数据成员到模板的实例化
- 如何调用成员初始化器列表中参考成员的构造函数
- 如果值来自成员变量,则复制初始化和参考初始化之间的C 差异
- 是否有一种方法可以始终通过值(制作副本)而不是在使用类成员函数时通过参考来传递
- 为什么合成的复制分配运算符被定义为如果类有参考成员,则将其定义为删除
- 为什么要为具有参考成员变量的类生成默认的复印件
- 参考的复制构造可以使用私有成员变量
- 通过名称或索引参考成员变量
- 不确定如何修复;非静态成员参考必须相对于特定对象
- 通过参考const成员通过参考时,尝试引用已删除的函数
- 成员函数返回成员变量的RVALUE参考
- 我如何在参考上使用数据成员而不使用新关键字创建对象
- 参考成员函数调用
- 通过构造从结构到其指针和参考成员
- 取参考成员(非 POD)的偏移量
- 用文字初始化参考成员变量
- 在这种情况下,我应该使用参考成员吗
- 参考成员是好的做法吗?都是const成员