【问题标题】:C++ const member functions are modifying member variablesC++ const 成员函数正在修改成员变量
【发布时间】:2011-11-15 11:13:57
【问题描述】:

今天我发现这样的代码有效。这对我来说听起来很奇怪,因为据我所知,你不能从 const 成员函数中修改任何成员。你实际上不能直接这样做,但你可以调用非常量成员函数。如果将成员函数标记为 const 表示传递给函数的这个指针指向的是 const 对象,那么下面的例子中如何调用非 const 成员函数?

#include <iostream>

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

int main()
{
}

【问题讨论】:

  • 改变变量的代码在哪里——你的代码什么都不做
  • 糟糕!抱歉 :) 这是 const 指针,我不修改指针本身,我修改了这个指针下的对象。无论如何,谢谢。这对我疲惫的大脑来说太长了:)
  • 我在这里看不到 const ???
  • 我可以在 VS2008 中重现这个。在我的理解中, foo() 的实现不应该编译,因为 const 成员调用了非常量成员。我已修改代码以禁止修改成员,并在 X 的 const 实例上调用 foo,没有错误消息。 (/W4)
  • @peterchen:编译器是正确的。 constness 在这种情况下不是传递性的,即 X* ptr;将是 Xconst ptr,而不是 X constconst ptr;

标签: c++ function constants member


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这似乎完全没问题。对 foo 的调用不会修改 ptr 成员。因此,foo 的 const 性受到尊重。

    我的 2 美分

    【讨论】:

    • bar 碰巧什么也不做的事实在这里并不重要。
    【解决方案3】:

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

    这就是区别

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

    更有趣的是,一个方法上的 const 出于同样的原因对引用成员没有任何影响(一个 const 方法只会阻止您对其他东西进行引用,而这些引用无论如何都无法完成) .

    【讨论】:

    • 一个 const 方法只会阻止您引用其他无法通过引用完成的东西 - 惊人的观察!
    猜你喜欢
    • 1970-01-01
    • 2021-01-08
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多