Re: Operator overloading and access to private members
On Feb 15, 11:28 am, obaqueiro <obaque...@gmail.com> wrote:
Hello, reading the Thinking in C++ book, i came into this code
snippter:
----------
#include <...>...
// code ommited
class Integer {
int i;
public:
Integer (int ii) {i = ii}
const Integer operator+ (const Integer & rv) const {
return Integer (i+rv.i); //
------ Isn't rv.i not visible ?? XXX
}
const Integer operator= (const Integer & rv){...
//code ommited}
};
int main (){
Integer I(1), J(2), K(3);
K = I+J;
// This does not compile... of course
// cout << K.i;
}
-----------
This indeed compiles (in GCC 4). What I can't fully understand why, in
the line market with the XXX, the function access rv.i where i is a
private member of the class Integer. Isn't rv.i supposed to be
inaccessible ? if I try to access K.i in main (the commented code) the
compiler does throw a "Integer::i is private" error. I would expect
the same in the other case.
So I think I am missing something, and the specific question would be
why does this happens? is there any special "visibility" for the
members of the parameters provided when overloading an operator (i.e.,
is it possible to see all the private members of the parameters?)
Thank you!
private members of a class are certainly visible to the class itself,
otherwise wouldn't they be left in limbo and be untouchable just
taking up space that is never used?
Review 'scope', 'public', 'protected', and 'private'
It is a very essential concept to understand. If you haven't studied
inheritance yet, these reasoning for these different visibilities will
make much more sense after. I'd recommend studying inheritance
simultaneously.
Make sure you have a solid grasp of these concepts. Too many people
just make it compile without understanding the impact of placing a
method or data member that should be private or protected as public.
Then I get to fix their bugs down the line only to discover the design
was garbage.
GL!