繁体   English   中英

为什么我可以调用从 const 方法更改成员的方法?

[英]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 (即指向Fooconst指针),而不是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM