我談到讓一個類支持隱式類型轉換通常是一個不好的主意。當然,這條規則有一些例外,最普通的一種就是在創建數值類型時。例如,假如你設計一個用來表現有理數的類,答應從整數到有理數的隱式轉換看上去并非不合理。這的確不比 C++ 的內建類型從 int 到 double 的轉換更不合理(而且比 C++ 的內建類型從 double 到 int 的轉換合理得多)。在這種情況下,你可以用這種方法開始你的 Rational 類:
class Rational { public: Rational(int numerator = 0, // ctor is deliberately not eXPlicit; int denominator = 1); // allows implicit int-to-Rational // conversions
int numerator() const; // accessors for numerator and int denominator() const; // denominator - see Item 22
result = oneHalf * 2; // fine (with non-explicit ctor) result = 2 * oneHalf; // error! (even with non-explicit ctor) 其原因在于僅僅當參數列在參數列表中的時候,它們才有資格進行隱式類型轉換。而對應于成員函數被調用的那個對象的隱含參數—— this 指針指向的那個——根本沒有資格進行隱式轉換。這就是為什么第一個調用能編譯而第二個不能。第一種情況包括一個參數被列在參數列表中,而第二種情況沒有。