函数上的关键字'const'意味着对象字段完全只读?
Keyword 'const' on functions imply a full read-only of the object fields?
具有以下对象
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;
相关文章:
- 将结构字段的类型展开为可变模板参数
- 将位字段导出到数组
- 为了方便起见,我应该避免公开私有字段变量吗
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 在java中读取c++字节的位字段
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- 私有字段对象与私有继承?
- 声明没有默认构造函数的字段
- C++内存模型和位字段的最大序列
- 声明为无效的变量或字段'...' Ardunio 编译器上的错误
- 如何在QByteArray中放置和检索位字段而不会感到痛苦?
- C++ win32 如何使密码字段可选并启用复制和粘贴?
- 如何通过UDP接收QByteArray并将其解析为位字段结构?
- 仅匹配集合中的某些字段
- 结构字段名称与 GDB 中的 STL 数组冲突
- 如何使用位字段将数据从二进制文件复制到结构中?
- 结构体和类的不同大小(),彼此具有相同的字段类型
- 函数上的关键字'const'意味着对象字段完全只读?
- Const 引用字段作为类中的只读属性C++
- C# 的只读字段修饰符C++等效项是什么?