A type has a certain visibility in the namespace to which the type belongs. Similarly, a member of of type has a certain visibility. You can state the visibility explicitly by giving a so-called visibility modifier, or you can rely on defaults. It is recommended always to use explicit visibility modifiers, because it reflects that you have made a conscious choice.
Overview and clarification of some visibility issues
Read more about visibility issues - in particular 'inconsistent accessibility' - in the text book version of this material.