【发布时间】:2023-04-06 07:25:01
【问题描述】:
我想问一个关于方法的 const 正确性的问题。让我来说明一下情况。
class MyClass
{
public:
...
void DiscussedMethod() { otherClass->NonConstMethod(); }
private:
OtherClass *otherClass;
};
我有一个类MyClass,它保存了一个指向OtherClass 的指针。在DiscussedMethod 中,它调用OtherClass::NonConstMethod 来修改一些可见数据。
我想知道,制作DiscussedMethod const 是否是一个好习惯(因为它不会修改任何成员数据)?这会是一个坏习惯吗?还是两者都可以?
如果OtherClass 保留了指向MyClass 的指针,并且在NonConstMethod 中修改了MyClass 的一些数据(这意味着MyClass 成员数据将在DiscussedMethod 调用期间发生变化),那会怎样。那么制作DiscussedMethod const 会是一种不好的做法吗?
据我所知,方法上的 const 主要是代码文档,所以我可能倾向于不制作 DiscussedMethod const,但我想听听你的意见。
编辑:有些回复会考虑otherClass 指向的对象是否归MyClass 对象所有。在我正在使用的场景中,情况并非如此。可以说两个对象并排独立存在(具有相互修改的能力)。我认为这个类比很好地描述了我的情况。
例如考虑像双向链表这样的东西,其中每个元素都是一个类,它保存指向其邻居的指针和成员变量color。它有方法MakeNeighboursRed,它改变了它的邻居的color,但不影响调用对象本身的状态。我是否应该考虑使用这种方法const?
如果MakeNeighboursRed 有可能会调用邻居的MakeNeighboursRed 会怎样。所以最终,最初调用MakeNeighboursRed 的对象的状态也会改变。
我要感谢大家的意见:-)
【问题讨论】:
-
这只是我个人的看法。有时指向的对象我认为是“主要对象的一部分”。这意味着,我可能会让
OtherClass成为正式成员,但它需要是动态/多态/等。在这种情况下,我不会将函数设为 const,即使它可能是。 -
关于你的编辑:我坚持我的回答:如果调用一个方法可能会改变你的对象的状态,那么它不应该是 const。 (即你改变了可能会改变这个状态的邻居。)我希望一个 const 方法来保留对象的状态。