There's much better resources than an answer typed up in a few minutes on stack overflow, but in short:
A public member is defining how you want the outside world to interact with your class. Generally, it's considered best practice to not have any variables public, and have the outside world interact with them with Set/Get functions.
Both protected and private hide members from the outside world, but also specify how a subclass can access them. Protected members are inherited; private members aren't.
Stylistically, I tend to think of protected and private as subroutines to by used by the class's public interface. If I make a collection of classes that are all "shapes", I factor out the common code of the public interfaces of "square", "circle", "triangle", and put them in protected functions in the base "shape" class. I tend not to use private very often. (Mostly because I do embedded work and I'm more interested in code sharing between classes, rather than interface encapsulation, and my code isn't ever used as a library to outside sources)