我不确定为什么我可以通过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方法修改对象的逻辑状态。那是因为我使用了指针吗?
否,您没有修改对象的逻辑状态:
f->change();
f
,对象的类成员,在这里一直都是。它的值没有改变。现在没有指向其他对象。它仍然指向它一直指向的同一对象。
您所做的修改是f
指向的对象。这是另一个对象。
请注意,以下示例成员函数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
}