函数上的关键字'const'意味着对象字段完全只读?

Keyword 'const' on functions imply a full read-only of the object fields?

本文关键字:字段 只读 对象 const 关键字 函数 意味着      更新时间:2023-10-16

具有以下对象

class Parser
{
public:
    Parser(ComponentFactory * const factory): _factory(factory) {};
    ~Parser() = default;
    void parse() const {
       _factory->setFoo("foo");
    }
private:
    Factory * _factory;
};

我的函数parse()被指定为 const 。也就是说,该函数不应修改当前对象状态,而只执行只读逻辑。

但是,工厂对象的修改是否意味着当前对象的状态发生了变化?在其他热中,这甚至可以编译吗?我想了解为什么如果是,因为我在网上找不到任何相关主题。

编辑:

既然没有人能理解这一点,让我试着更好地解释一下。简单来说,上面的代码应该编译吗?

但是,工厂对象的修改是否意味着当前对象的状态发生了变化?

在其他热中,这甚至可以编译吗?

是的。

我想了解为什么如果是,因为我在网上找不到任何相关主题。

假设你有

struct Foo
{
   int* ptr;
   Foo() : ptr(new int(0)) {}
   // It is valid since it does not change the state of Foo.
   // It does not change where ptr points to. It just changes
   // the value of what ptr points to.
   void set(int value) const { *ptr = value; }
};

编译器为您提供基本的const特征。 更高级别的const需要由类本身实现。

Foo的情况下,如果更改ptr的值被认为改变了Foo的创建者Foo的状态,那么你必须从成员函数中删除const限定符。

函数标记为const意味着您无法:

  • 更改this 的 IVAR 的任何值
  • this 或其任何 IVAR 上调用非const函数

例如,它会将int foo;视为const int foo;

这些属性不会传递到指针。 Factory *_factory;不会变成const Factory *_factory;,它会变成Factory *const _factory;,这是你已经拥有的。

想象一下,如果您改用智能指针,您是否希望编译器知道它应该将std::shared_ptr<Factory> _factory;转换为std::shared_ptr<const Factory> _factory;?它所做的只是将其视为const std::shared_ptr<Factory> _factory;