My question is, I declared use and p as private member, why, from the initializer list in the Copy constructor, it could direct refer to the private member?
the private keyword means that the members' visibility is restricted to class scope - it doesn't restrict access down to the individual object level.
In other words, two objects which are of the same class can access each other's implementation details, because those implementation details are effectively one and the same. (The same is true for static functions which belong to that class, although static functions which need access shouldn't really be static in the first place)
However, other functions from another external class, including base or derived classes, or standalone functions will not be able to see private implementation details (unless they are a friend of the class).