Here again, the constructor is declared 'explicit' to avoid inadvertent assignments. To increase payment by 5 percent, use the following form instead:

payment=USD(payment*1.05);

Now, everything's in order. Inadvertent conversions by a promiscuous constructor are blocked, whereas well-behaved conversions to double that rely on the conversion operator are permitted.

Better Safe than Sorry
Programmers often moan about the lack of a const char * conversion operator in class std::string. If std::string had such an operator, you could write

string filename;
ifstream inf(filename);

Instead of the ugly:

ifstream inf(filename.c_str());

However, the C++ standardization committee decided not to include a conversion operator of this kind in std::string because it might cause nasty bugs in certain libraries in which char * are used extensively. In this case, the committee adhered to the "better safe than sorry" idiom. By contrast, <fstream> objects contain a conversion operator to type void* which enables you to use them like this:

When you design your own classes, consider which automatic conversions are desirable and which ones should be disabled. Then, enable legitimate conversions by defining the appropriate conversion operators while blocking undesirable conversions by declaring constructors explicit.