c++ - 创建一个修改类 const 之外的数据的方法是一种好习惯吗?

标签 c++ methods constants

我想问一个关于方法的常量正确性的问题。让我来说明一下情况。

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/

相关文章:

c++ - 尝试读取 sizeof() 返回意外结果

c++ - 在 C++ 中使用命名空间

c# - FileStream Read/Write 方法的限制

c++ - 设备驱动程序库

c++ - RotatedRect 的 OpenCV 最小直立边界矩形

c++ - 良好做法 : Constant to non-constant cast

c++ - 在构造函数 C++ 标准中修改 const 吗?

c - c 语法问题 - const * const * 定义

java - 找不到类的方法?

java - 方法调用 equals 可能会产生 java NullpointerException