条款24:若所有参数皆需类型转换,请为此采用 non-member 函数

Declare non-member functions when type conversions should apply to all parameters.

令 classes 支持隐式类型转换通常是个糟糕的行为,但也是有例外的,最常见的例外就是在建立数值类型的时侯。

考虑一个有理数类,允许整数隐式转换为有理数似乎很有道理:

class Rational {
public:
    Rational(int numerator = 0, int denominator = 1);
    ...
};

现在研究一下这个类的乘法实现:

class Rational {
public:
    const Rational operator* (const Rational& rhs) const;
};

Rational result, oneHalf;
// 尝试混合运算
result = oneHalf * 2;    // 成功;
result = 2 * oneHalf;    // 失败;

第一行的运算之所以成功是因为发生了隐式类型转换(implicit type conversion),编译器会自动调用 Rational 的构造函数将 int 变成 Rational。当然,只有在构造函数为 non-explicit 时,编译器才会这样做。所以为了实现混合运算,应该让 operator* 成为一个 non-member 函数:

const Rational operator*(const Rational& lhs, const Rational& rhs) {
    return Rational(lhs.numerator() * rhs.numerator(), lhs.denominator() * rhs.denominator());
}

Last updated

Was this helpful?