【问题标题】:Modifying reference member from const member function in C++从 C++ 中的 const 成员函数修改引用成员
【发布时间】:2021-01-08 16:13:56
【问题描述】:

我正在研究我的代码的 const 正确性,只是想知道为什么这段代码可以编译:

class X
{
    int x;
    int& y;
public:
    X(int& _y):y(_y)
    {
    }
void f(int& newY) const
    {
        //x = 3; would not work, that's fine
        y = newY; //does compile. Why?
    }
};

int main(int argc, char **argv) 
{
    int i1=0, i2=0;
    X myX(i1);
    myX.f(i2);
...
}

据我了解,f() 正在更改对象 myX,尽管它说是 const。当我分配给 y 时,如何确保我的编译器抱怨? (Visual C++ 2008)

非常感谢!

【问题讨论】:

  • 想象它是一个指针而不是一个引用。然后你可以看到*y = newY 仍然可以是 const,因为指针本身没有改变,只是指针。同样,引用没有改变(这是不可能的),只是它所指的。

标签: c++ reference constants


【解决方案1】:

作为已接受答案的附加信息,我想说,实际上可以 更改 X 中的变量。

因为您没有更改 X 中的任何变量。

#include <iostream>
#include <string>
#include <vector>
using namespace std;

class Bar {
public:
    void funcA() const {
        c++;
    }

    int b = 3;
    int &c = b;
};

int main()
{
    Bar b;
    b.funcA();
    cout << b.b << endl;  //4
}

所以这个问题的主要思路是:

它修改了成员所指的内容,它不修改成员。

这也适用于指针成员。

请看这里Why can reference members be modified by const member functions?

【讨论】:

    【解决方案2】:

    情况类似于指针成员。在 const 成员函数中,const 适用于指针本身,而不是指针对象。

    区别在于:

    X* const //this is how the const applies: you can modify the pointee
    const X*
    

    X&amp; const 除外,这不是有效的语法,因为一开始就不能引用另一个对象(它们总是隐含的 const)。总之:方法上的 const 对成员引用没有影响。

    【讨论】:

      【解决方案3】:

      因为您没有更改 X 中的任何变量。实际上,您正在更改_y,这是您班级的局外人。别忘了:

      y = newY;
      

      newY 的值分配给y 指向的变量,而不是它们本身的引用。只有在初始化时才会考虑引用。

      【讨论】:

      • +1,这就是答案。注意指针的等价性,也许这更容易理解,假设你声明int *y;,那么*y = newY 是有效的,但y = &amp;newY 不是。
      • 谢谢。我想我真正想要的是一个指针作为成员。
      • 当然,y可以用来引用一个类成员,然后它会修改类的状态。碰巧在这个例子中它没有。
      • @visitor:我的第一个想法也是。但那将是邪恶的。
      猜你喜欢
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-12
      • 1970-01-01
      • 2016-08-17
      • 1970-01-01
      相关资源
      最近更新 更多