I have learned that I can never access a private variable, only with a get-function in the class. But then why can I access it in the copy constructor?
Example:
You can access private members of a class from within the class, even those of another instance.
To understand the answer, I would like to remind you few concepts.
this
pointer is passed to every function when called.Now it's because of the this
pointer, function is able to locate variables of that particular instance. no matter if it is private of public. it can be accessed inside that function. Now if we pass a pointer to another object of the same class. using this second pointer we will be able to access private members.
Hope this answers your question.
Copy constructor is class' member function and as such has access to class' data members, even those declared as 'private'.
IMHO, existing answers do a poor job explaining the "Why" of this - focusing too much on reiterating what behaviour's valid. "access modifiers work on class level, and not on object level." - yes, but why?
The overarching concept here is that it's the programmer(s) designing, writing and maintaining a class who is(are) expected to understand the OO encapsulation desired and empowered to coordinate its implementation. So, if you're writing class X
, you're encoding not just how an individual X x
object can be used by code with access to it, but also how:
X
objects cooperate to provide intended behaviours while honouring the post-conditions and invariants from your design.It's not just the copy constructor either - a great many operations can involve two or more instances of your class: if you're comparing, adding/multiplying/dividing, copy-constructing, cloning, assigning etc. then it's often the case that you either simply must have access to private and/or protected data in the other object, or want it to allow a simpler, faster or generally better function implementation.
Specifically, these operations may want to take advantage of priviledged access to do things like:
shared_ptr
s to reference data etc.auto_ptr<>
"moves" ownership to the object under constructionunordered_map
member but publicly only expose begin()
and end()
iterators - with direct access to size()
you could reserve
capacity for faster copying; worse still if they only expose at()
and insert()
and otherwise throw
....The access modifiers work on class level, and not on object level.
That is, two objects of the same class can access each others private data.
Primarily due to efficiency. It would be a non-negligible runtime overhead to check if this == other
each time you access other.x
which you would have to if the access modifiers worked on object level.
It's also kind of semantically logical if you think of it in terms of scoping: "How big part of the code do I need to keep in mind when modifying a private variable?" – You need to keep the code of the whole class in mind, and this is orthogonal to which objects exist in runtime.
And it's incredibly convenient when writing copy constructors and assignment operators.