C++ C++;常量成员函数正在修改成员变量

C++ C++;常量成员函数正在修改成员变量,c++,function,constants,member,C++,Function,Constants,Member,今天我发现这样的代码是有效的。这听起来真的很奇怪,因为据我所知,您不能修改const member函数中的任何成员。实际上,您不能直接执行此操作,但可以调用非常量成员函数。如果将成员函数标记为const,这意味着传递给该函数的指针指向const对象,那么在下面的示例中如何调用非const成员函数 #include <iostream> class X { public: void foo() const { ptr->bar(); }

今天我发现这样的代码是有效的。这听起来真的很奇怪,因为据我所知,您不能修改const member函数中的任何成员。实际上,您不能直接执行此操作,但可以调用非常量成员函数。如果将成员函数标记为const,这意味着传递给该函数的指针指向const对象,那么在下面的示例中如何调用非const成员函数

#include <iostream>

class X
{
public:
    void foo() const
    {
        ptr->bar();
    }
    void bar() {}
private:
    X * ptr;
};

int main()
{
}
#包括
X类
{
公众:
void foo()常量
{
ptr->bar();
}
无效条(){}
私人:
X*ptr;
};
int main()
{
}

您的成员变量不是
X
,而是指向
X
的指针。只要
foo
不修改指针,指针就可以是
const

,这似乎完全可以。对foo的调用不会修改ptr成员。因此,foo的稳定性受到尊重


我的2美分

当您有一个指针成员时,指针在const方法中是const。不允许您更改指针中存储的地址。但是你可以随意改变指针

这是两者的区别

X* const cannot_change_pointer;  //this is how top-level const applies to pointers
const X* cannot_change_pointee;

更有趣的是,方法上的const对引用成员没有任何影响,原因也是一样的(const方法只会阻止您引用其他引用,而引用无论如何都无法完成)。

更改变量的代码在哪里?您的代码不起作用!抱歉:)这是常量指针,我不修改指针本身,而是修改该指针下的对象。无论如何,谢谢。这对我疲惫的大脑来说是一个漫长的夜晚:)我看不到这里没有常数???我可以在VS2008中重新编程。我认为foo()的实现不应该编译,因为常量成员调用非常量成员。我已经将代码修改为bar修改一个成员,并在X的const实例上调用foo,没有错误消息。(/W4)@peterchen:编译器是正确的。constness在该上下文中是不可传递的,即X*ptr;将是Xconst ptr,而不是X const ptr;事实上,bar只是碰巧什么都不做,这一点在这里并不重要。const方法只会阻止你引用其他引用,而这些引用无论如何都不能用引用来完成-惊人的观察!