All Rights Reserved. It's a complicated choice, really, and depends on how and where the data is being used. In what follows I don't claim to be particularly original.
Gems is very worth reading, especially regarding how to structure one's header files.
In Java, for example, there is only one choice - one has something that is roughly equivalent to pointers that are used with reference symantics. It is not a bad choice for most situations, but there is no alternative, not even when another choice would be appropriate, say to gain performance. Details of this inflammatory accusation will be left for a future article though. I think this serves as a warning that this really is a complicated and detailed topic, and I worry that I will scare away beginners. After programming in Metrowerks PowerPlant for a couple of months, I read the two books but not very much of the advice stuck.