我想问一个关于方法的常量正确性的问题。让我来说明一下情况。
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
的对象的状态也会发生变化。
我要感谢大家的意见:-)
最佳答案
如果MyClass
拥有 OtherClass
例如我不会做DiscussedMethod
持续的。
类(class)也是如此,管理资源。 IE。标准容器不会使用 const 函数返回非 const 引用或指向托管内存的指针,尽管这是“可能的”(因为持有资源的实际指针未被修改)。
考虑
class MyClass
{
public:
bool a() const { return otherClass->SomeMethod(); }
void b() const { otherClass->NonConstMethod(); }
private:
OtherClass *otherClass;
};
void foo (MyClass const &x)
{
cout << boolalpha << x.a() << endl;
x.b(); // possible if b is a const function
cout << boolalpha << x.a() << endl;
}
foo
尽管 foo
的实现者可以打印两个不同的值可能会期望对 const 对象的两个函数调用具有相同的行为。
为了澄清:
自 operator[]
的 const 版本以来,根据标准,以下内容无效返回 std::vector<T>::const_reference
这是对值类型的常量引用。
std::vector<int> const a = { /* ... */ };
a[0] = 23; // impossible, the content is part of the state of a
如果这个函数只有一个签名,即referece operator[] (size_t i) const;
,那将是可能的,因为该操作不会改变 vector 的内部指针,但会改变它们指向的内存。
但是由 vector 管理的内存被认为是 vector 状态的一部分,因此无法通过 const vector 接口(interface)进行修改。
如果 vector 包含指针,这些指针仍然无法通过公共(public) const vector 接口(interface)进行修改,尽管存储在 vector 中的指针很可能是非 const 的,并且很可能会改变它们指向的内存。
std::vector<int*> const b = { /* ... */ };
int x(2);
b[0] = &x; // impossible, b is const
*b[0] = x; // possible since value_type is int* not int const *
关于c++ - 创建一个修改类 const 之外的数据的方法是一种好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25972101/