Modifying reference member from const member function in C++

后端 未结 3 1045
走了就别回头了
走了就别回头了 2020-12-06 03:57

I am working on const-correctness of my code and just wondered why this code compiles:

class X
{
    int x;
    int& y;
public:
    X(int& _y):y(_y)
         


        
相关标签:
3条回答
  • 2020-12-06 04:53

    As additional information for the accepted answer, I want to say, in fact one can change variables in X.

    Because you are not changing any variable in 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
    }
    

    So the main idea for this problem is:

    It modifies what the member refers to, it does not modify the member.

    This also applies for pointer members.

    See here Why can reference members be modified by const member functions?

    0 讨论(0)
  • 2020-12-06 04:59

    The situation is similar to pointer members. In a const member function, the const applies to the pointer itself, not the pointee.

    It's the difference between:

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

    Except X& const isn't valid syntax, since the reference can't be made to refer to another object in the first place (they are implicitly always const). In conclusion: const on methods has no effect on member references.

    0 讨论(0)
  • 2020-12-06 05:02

    Because you are not changing any variable in X. Actually, you are changing _y which is an outsider with respect to your class. Don't forget that:

    y = newY;
    

    Is assigning the value of newY to the variable pointed by y, but not the references them selves. Only on initialization the references are considered.

    0 讨论(0)
提交回复
热议问题