有以下对象
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
-ness需要由类本身实现。
在Foo
的情况下,如果改变ptr
的值被认为是由Foo
的创建者改变Foo
的状态,那么你将不得不从成员函数中删除const
限定符。
将函数标记为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;