8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

在 C++ 中从 const 成员函数修改引用成员

Žiga Grošelj 2月前

28 0

我正在研究代码的 const 正确性,只是想知道为什么此代码可以编译:class X{ int x; int& y;public: X(int& _y):y(_y) { }void f(int& newY) const...

我正在研究代码的 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)

非常感谢!

帖子版权声明 1、本帖标题:在 C++ 中从 const 成员函数修改引用成员
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Žiga Grošelj在本站《class》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 因为您没有更改 中的任何变量 X 。实际上,您正在更改 _y 相对于您的班级而言是局外人的变量。不要忘记:

    y = newY;
    

    将 的值赋给 newY 指向的变量 y ,但不赋给引用本身。仅在初始化时考虑引用。

  • +1,这就是答案。请注意与指针的等价性,也许这更容易理解,假设您声明 int *y;,则 *y = newY 有效,但 y = &newY 无效。

  • 当然,y 可以引用类成员,然后它将修改类的状态。但在本例中,它恰好没有这样做。

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

    其区别在于:

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

    Except X& const 不是有效的语法,因为引用首先不能用于引用另一个对象(它们始终隐式为 const)。总而言之:方法上的 const 对成员引用没有影响。

  • 作为已接受答案的附加信息,我想说,事实上人们可以改变 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
    }
    

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

    它修改成员所引用的内容,而不是修改成员本身。

    这也适用于指针成员。

    参见这里 为什么引用成员可以被const成员函数修改?

返回
作者最近主题: