For example I have an accessor function for a class:
class A {
public:
int a;
int& getA() const;
};
int& A::getA () const {
return a; // error: invalid initialization of reference of type 'int&' from expression of type 'const // int'
}
The questions are:
1. The data member 'a' is not of type 'const int', so why the error?
2. Also when I change the return type to int it works. why?
Because you specify that getA() is const. Returning a non const reference to a member variable from a method declared as const would allow to modify the value referenced.
If you want a read-only accessor then just declare the accessor as
const int& A::getA() const
otherwise you must remove constness from the method.
Turning the returned value to an int is allowed because you are not returning a reference anymore, but a copy of a so there is no way to modify the original member variable.
Mind that you are allowed to have them both available:
int& getA() { return a; }
const int& getA() const { return a; }
The error comes from the fact that the member function is marked const. You cannot return a non-const reference in a const method because the calling location can modify the value:
a.getA() = 2;
When you return an int it copies that value and makes the above produce a compilation error.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With