Always give any new class a default constructor, a copy constructor, and an assignment operator.
Another misconception I see often is a fuzzy idea of the difference between the copy constructor and the assignment operator.
In other words, both objects will behave the same way and return the same results when their methods are called.
If they have public data members (generally a bad idea), they have the same values.
These three functions are special in C : If you don't provide them yourself, C provides them for you. Among other things, this means you have to define these operations even if you don't want a client to be able to copy or default-construct a particular class.
If you don't want a class to be copied, for example, you have to define an empty copy constructor and assignment operator yourself and make them private or protected.
Over this time, I've developed a stock interview question that's proven to be a pretty good gauge of C knowledge.
No one has yet been able to just rip out the correct answer, but we've had several, including the guy we hired, who understood the important issues and were able to get the question right with prompting.
This doesn't necessarily mean that the objects are identical: some purely internal data members (such as caches) might not be copied, or data members pointing to other objects might end up pointing to different objects that are themselves semantically equivalent, rather than pointing to the same objects.
The difference between the copy constructor and assignment operator is that the copy constructor is a constructor a function whose job it is to turn raw storage into an object of a specific class.