I have a topic I'm confused on that I need some elaborating on. It's operator overloading with a const version and a non-const version.
// non-const double &operator[](int idx) { if (idx < length && idx >= 0) { return data[idx]; } throw BoundsError(); }
I understand that this lambda function, takes an index and checks its validity and then returns the index of the array data in the class. There's also a function with the same body but with the function call as
const double &operator[](int idx) const
Why do we need two versions?
For example, on the sample code below, which version is used in each instance below?
Array a(3); a[0] = 2.0; a[1] = 3.3; a[2] = a[0] + a[1];
My hypothesis that the const version is only called on a[2]
because we don't want to risk modifying a[0]
or a[1]
.
Thanks for any help.
Overloading on the basis of const type can be useful when a function returns a reference or pointer. We can make one function const, that returns a const reference or const pointer, and another non-const function, that returns a non-const reference or pointer.
In C++ programming, when we implement the methods for classes, we usually add const specifier to make sure that the members of the class instance will not be modified by the method.
When both versions are available, the logic is pretty straightforward: const
version is called for const
objects, non-const
version is called for non-const
objects. That's all.
In your code sample a
is a non-const
object, meaning that the non-const
version is called in all cases. The const
version is never called in your sample.
The point of having two versions is to implement "read/write" access for non-const
objects and only "read" access for const
objects. For const
objects const
version of operator []
is called, which returns a const double &
reference. You can read data through that const reference, but your can't write through it.
To supply a code example to complement the answer above:
Array a(3); a[0] = 2.0; //non-const version called on non-const 'a' object const Array b(3); double var = b[1]; //const version called on const 'b' object const Array c(3); c[0] = 2.0; //compile error, cannot modify const object
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