gpt4 book ai didi

c++ - 我应该将这些方法声明为 const 吗?

转载 作者:IT老高 更新时间:2023-10-28 23:00:32 24 4
gpt4 key购买 nike

我正在编写一些 C++ 代码,其中我有几个具有私有(private)方法的管理器对象,例如

void NotifyFooUpdated();

在此对象的监听器上调用 OnFooUpdated() 方法。

请注意,它们不会修改此对象的状态,因此从技术上讲,它们可以作为 const 方法,即使它们通常会修改整个系统的状态。特别是,监听器对象可能会回调该对象并对其进行修改。

就我个人而言,我希望它们保持原样,而不是声明它们 const

然而,我们的静态代码检查器 QAC 将此标记为偏差,所以我要么必须声明它们 const,要么我不得不争论为什么它们应该保持非常量并获得授权偏差。

什么是不声明这些方法const的论据?
还是我应该遵循 QAC 并声明它们 const
我应该采用仅限于此对象的严格局部观点,还是将系统视为一个整体?

最佳答案

简单地说,你有一个容器类:一个满是观察者的经理。在 C 和 C++ 中,您可以拥有具有非常量值的 const 容器。考虑是否去掉一层包装:

list<Observer> someManager;

void NotifyFooUpdated(const list<Observer>& manager) { ... }

您不会发现全局 NotifyFooUpdated 采用 const 列表没有什么奇怪的,因为它不会修改列表。该 const 参数实际上使参数解析更加宽松:该函数同时接受 const 和非 const 列表。类方法版本上的所有 const 注释均是 const *this

从另一个角度阐述:

If you can't guarantee that the object you invoked the function on remains the same before and after the function call, you should generally leave that as non-const.

只有当调用者拥有对该对象的唯一引用时,这才是合理的。如果对象是全局的(就像在原始问题中一样)或在线程环境中,任何给定调用的常量性都不能保证对象的状态在调用过程中保持不变。一个没有副作用并且总是为相同的输入返回相同值的函数是 pure。 NotifyFooUpdate() 显然不是纯粹的。

关于c++ - 我应该将这些方法声明为 const 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3968404/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com