Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Accessor functions in class c++

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?

like image 539
tinus91 Avatar asked Mar 01 '26 10:03

tinus91


2 Answers

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; }
like image 61
Jack Avatar answered Mar 03 '26 01:03

Jack


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.

like image 44
clcto Avatar answered Mar 02 '26 23:03

clcto



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!