【问题标题】:Should member functions be "const" if they affect logical state, but not bitwise state?如果成员函数影响逻辑状态而不是按位状态,它们应该是“const”吗?
【发布时间】:2011-03-06 02:14:49
【问题描述】:

我正在编写一个封装了控制硬件设备的传统 C API 的类。在一个简化的例子中,我可能有类似的东西:

class device
{
public:
    void set_request(int data) { legacy_set_req(p_device, data); }
    int get_response() const   { return legacy_get_rsp(p_device); }
private:
    device_handle_t *const p_device;
};

类本身没有按位状态;因此,我可以选择将set_request() 声明为const,编译器会对此感到满意。但是,从语义的角度来看,这是否是正确的方法,因为它会影响对象的 可观察 行为? (即封装的硬件设备确实有状态。)

【问题讨论】:

    标签: c++ constants


    【解决方案1】:

    我相信const 应该反映逻辑 const-ness,无论内部表示如何。仅仅因为你的对象只包含一个指向发生变化的东西的指针,并不意味着你的所有成员函数都应该是const

    C++ 甚至具有用于内部表示的 mutable 概念,即使在概念上对象没有变化,它也需要更改。 const 关键字显然不是为了表示“按位”常量。

    【讨论】:

    • 谢谢大家。几乎一致同意,基本上是我希望的答案。我接受这个答案是因为关于 mutable 的有趣争论。
    【解决方案2】:

    如果它改变了状态,它一般应该是const。相关状态为远程拥有(即在受控设备中)这一事实并没有改变这一点。

    【讨论】:

      【解决方案3】:

      一个有用的测试是:

          只有const 访问设备实例的代码可能会干扰没有const 访问权限的代码的操作

      基本上,const 访问意味着您实际上是一个观察者。在这里,如果某个假定的观察者在时间 T2 使用不同的参数调用 set_request(),那么在 T1 时间调用 set_request(...) 然后在 T3 时间调用 get_response() 的代码看起来会被严重搞砸。出于这个原因,set_request(...) 不应该被观察者访问 - 它应该是非const

      (测试有一些注意事项 - 例如,如果 const“观察者”需要锁定,从时间角度来看,它显然会影响来自另一个线程的非 const 使用,但不应该从功能性角度这样做- 但很明显如何将其纳入您的分析)。

      【讨论】:

        【解决方案4】:

        与其他类型和成员资格(例如,public、private、virtual)一样,const 表达意图和支持该意图的语言语义(即安全特性)。在这种情况下,即使底层语义是安全的,意图也会显得违反直觉。我不会这么做的。

        【讨论】:

          猜你喜欢
          • 2016-10-16
          • 1970-01-01
          • 1970-01-01
          • 2013-08-21
          • 2021-05-03
          • 2019-07-04
          • 2019-04-28
          • 2017-10-27
          • 1970-01-01
          相关资源
          最近更新 更多