Well, defining clean and useful ("beautiful" is a poor qualifier) interfaces is all about making sure that :
- The user understands with minimal pain how to use your object (or system of objects) just by reading it's interface.
- The user will have a hard time using the object/system in a wrong way - the interface makes it hard to do something wrong or signal problems early.
- The interface describe a useful abstraction.
The points 1. and 2. requires you to think a lot about the contract you're making with your user. That contract, or protocol, is the way to communicate to the user how he can use your system. For example, read-only member functions (const member functions) tells a lot about in wich situations you should be able to call that function. In the same way, the attributes of each function dives the user to gather and provide the minimal informations required for the system to work.
All points together suggest that your interfaces should only show services that are useful to the user. First to limit user's use of the system to only what the sytem was made for. Second, by avoiding him to manipulate internal state in a wrong way. So, the easiest way in C++ to achieve this is to put all members private and explicitely state which services your system provides, using member or global functions (in namespace(s)). Another way is to use the PImpl idiom.
Third, and the most important : your interface should provide a useful abstraction, meaning that the user shouldn't have to understand implementation. When I drive a car or a washing machine, I don't want to know how it's built inside (even if I'm a technology geek...). I just need to use it and not have to bother about what's inside.
Any protocol definition, like designing a programming language or designing a class is not as obvious asa you may have thought first. A lot of experience is required to apreciate the subtelties of desiging interfaces.
All that isn't revelant when you're defining structures or classes that represent very low level concepts. The higher you get from hardware, the most you need to have clean, clear & useful interfaces.