[英]Why can I call a non-const member function pointer from a const method?
[英]Why can I call a method that changes a member from a const method?
我不确定为什么我可以从 const 方法修改 object,请看:
#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 方法修改 object 的逻辑 state 。 那是因为我使用了指针吗?
const
适用于指针本身f
,而不适用于该指针所指向的内容。 f
在您的const
限定成员 function, Test::test()
中的类型是Foo* const
(即指向Foo
的const
指针),而不是const Foo*
(即指向const Foo
的指针)。 这就是为什么您可以修改指针指向的内容,尽管成员 function 具有const
限定。
请注意,以下示例成员 function, Test::test2()
确实无法编译,因为它是const
限定的并尝试修改指针数据成员f
:
void Test::test2() const {
f = nullptr; // <-- error
}
不,您没有修改 object 的逻辑 state:
f->change();
f
,对象的 class 成员,一如既往,在这里。 它的价值没有改变。 它现在不指向其他一些 object。 它仍然指向它一直指向的同一个 object。
您所做的修改是f
指向的 object。 这是一个不同的 object。
是的,您修改了 object 的逻辑state。 这是允许的,因为const
禁止修改物理state。
object t
有一个数据成员f
,其类型是“指向 Foo 的指针”。 创建t
object 时,它的f
成员指向Foo
类型的 object 。 在调用t.test()
之后, f
成员仍然拥有相同的地址,因此它与之前一样指向Foo
类型的相同 object。
如果test()
试图更改存储在f
中的值(即指针),则const
会阻止它。
void Test::test() const { f = new Foo; } // error: `f` is const in this context
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.