c++ - C++ 类中的私有 const 是多余的吗?
问题描述
假设我有一个带有我不想更改的成员变量的类。假设没有 setter 函数,将该变量设为私有 const 与仅将变量设为私有之间有什么区别吗?
私人的:
class ConstFoo
{
public:
Foo(int a);
virtual ~Foo();
int val(){ return val_; }
private:
int val_;
}
私人常数:
class ConstFoo
{
public:
Foo(int a);
virtual ~Foo();
int val(){ return val_; }
private:
const int val_;
}
似乎两者之间没有区别,因为val_
在任何一种情况下都无法更改值,因此const
限定符似乎是多余的。
我可以看到显式添加的一个原因const
是为了代码清晰,因此将来处理代码的人不会向函数添加 setter。但是,由于名称ConstFoo
和文档明确指出它不是可变的,我认为这不会是一个问题。
解决方案
这完全取决于您希望这个值有多“const”。
就目前而言,没有外部用户可以直接更改该值。但他们可以间接这样做,因为对象本身可能不是const
:
ConstFoo a{0};
ConstFoo b{2};
a = b;
a
现在有 2 个。
另外,里面 ConstFoo
的代码也可以改变它的值;这就是复制赋值运算符可以更改其值的原因。
因此,如果您想确保特定成员对象在任何ConstFoo
实例的整个生命周期中都采用一个值,您可以声明它const
。
当然,这使得ConstFoo
不可分配。
推荐阅读
- c++ - 在共享指针上看到意外数据
- python - 在python中计算低于阈值的所有特征值和相应特征向量的最快方法
- xml - Odoo - 在 xml 中扩展上下文而不是替换
- python - Jupyter notebook 中的主要代码未识别 python 函数参数
- reactjs - 如何测试一个组件是否被玩笑和酶渲染?
- c# - C# 终端游戏脚本给出错误 CS0103
- javascript - 事件委托 - 元素样式问题 - Javascript
- css - 面临禁用时日历图标在另一个日历弹出窗口上重叠的问题
- css - 移动到子文件夹后 CSS 不起作用
- python - 有没有一种好方法可以在 on_message_delete 事件中找到删除消息的人?