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

问题描述 投票:-1回答:2

有以下对象

class Parser
{

public:
    Parser(ComponentFactory * const factory): _factory(factory) {};
    ~Parser() = default;

    void parse() const {
       _factory->setFoo("foo");
    }

private:
    Factory * _factory;
};

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

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

编辑:

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

c++ const
2个回答
0
投票

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

没有

在其他方面,这甚至可以编译吗?

是。

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

说你有

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-ness需要由类本身实现。

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


0
投票

将函数标记为const意味着您不能:

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

例如。它会将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;

© www.soinside.com 2019 - 2024. All rights reserved.