gpt4 book ai didi

c++ - 关于 const 实例方法的最佳实践是什么?

转载 作者:行者123 更新时间:2023-11-30 00:42:24 25 4
gpt4 key购买 nike

鉴于已接受的答案指出从 const 实例方法返回对成员的非 const 引用不会编译(没有强制转换或使成员变量可变),问题变得更普遍-练习 const 实例方法的讨论。

为了后代,这里是原始问题:

如果我有一个带有返回非常量引用的 getter 的对象,例如:

SomeObject& SomeOtherObject::foo(){
return someObjectInstance;
}

这应该设为常量吗?显然,调用本身不会修改对象,但调用者可以修改 someObjectInstance,这会改变我的 SomeOtherObject 实例。

我想我的问题真的可以归结为“成员方法上的 const 到底是什么意思?”是 A) 调用本身不会改变对象还是 B) 没有改变object 可以在调用期间出现,也可以作为返回的引用/指针的结果出现(对执行 const_casts 的人有警告)。

顺便说一句,我目前在需要 const 调用的地方添加它。

 const SomeObject& SomeOtherObject::constFoo() const{
return someObjectInstance;
}

保险起见,我舍不得

 SomeObject& SomeOtherObject::foo() const{
return someObjectInstance;
}

即使在某些地方它会让我的生活更轻松。

最佳答案

const(应用于成员函数时)主要用作 self 记录的一种方式。这是与调用代码的约定,此函数不会修改外部状态(即没有可观察到的副作用)。

编译器通过在 const 成员函数内使所有成员有效地成为 const 来实现这一点

这样的代码并不少见:

const SomeObject& SomeOtherObject::constFoo() const;
SomeObject& SomeOtherObject::constFoo();

以下不会编译(MSVC 9 和 gcc 3.4.4)

SomeObject& SomeOtherObject::constFoo() const{
return someObjectInstance;
}

您可以通过丢弃常量来绕过上述错误:

SomeObject& SomeOtherObject::constFoo() const{
return (SomeObject&)someObjectInstance;
}

但这当然会破坏与代码用户之间的契约(Contract),即您不会更改 SomeOtherObject 实例。

你也可以让 someObjectInstance mutable 来避免强制转换,但最终它确实好不到哪里去。

关于c++ - 关于 const 实例方法的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1045985/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com