为什么要调用从const方法更改成员的方法?

问题描述 投票:1回答:2

我不确定为什么我可以通过const方法修改对象,请看:

#include <iostream>

struct Foo {
    int a = 0;
    void change() {
        a = 3;
    }
};

struct Test {
    Foo* f;

    Test(): f{new Foo} {}

    void test() const {
        f->change();
    }
};

int main()
{
  Test t;
  std::cout << "before: " << t.f->a << "\n";
  t.test();
  std::cout << "after: " << t.f->a << "\n";

}

不仅编译,而且打印:

0
3

因此,我能够通过const方法修改对象的逻辑状态。那是因为我使用了指针吗?

c++ pointers const const-correctness
2个回答
0
投票

否,您没有修改对象的逻辑状态:

    f->change();

f,对象的类成员,在这里一直都是。它的值没有改变。现在没有指向其他对象。它仍然指向它一直指向的同一对象。

您所做的修改是f指向的对象。这是另一个对象。


0
投票

const适用于指针本身f,不适用于此指针指向的对象。在f限定的成员函数const中,Test::test()的类型为Foo* const(即const指向Foo的指针),而不是const Foo*(即指向const Foo的指针)。这就是为什么尽管成员函数具有const限定条件也可以修改指针指向的内容的原因。


请注意,以下示例成员函数Test::test2()确实无法编译,因为它是const限定的,并试图修改指针数据成员f

void Test::test2() const {
        f = nullptr; // <-- error
}
© www.soinside.com 2019 - 2024. All rights reserved.