It's worth remembering that constructors can also be considered to act as casts, and will be used by the compiler to perform cast-like conversions. For example:
class Person {
public:
Person( const std::string & name );
...
};
The Person constructor acts a conversion from string -> Person:
Person p = Person( "fred" );
and will be used by the compiler when a string needs to conversted to a person:
void PrintPerson( const Person & p ) {
...
}
the compiler can now convert a string to a Person:
string name = "fred";
PrintPerson( name );
but note that it cannot do this:
PrintPerson( "fred" );
as this would require the compiler to construct a chain of conversions.
Edit: I have posted a follow-up question on the topic of conversions - see C++ implicit conversions.