Skip to content

Latest commit

 

History

History
41 lines (41 loc) · 1.56 KB

rule24.md

File metadata and controls

41 lines (41 loc) · 1.56 KB

若所有的参数都需要类型转换,请为此采用non-member函数

  • 考虑如下需求: 定义一个整数类完成,实现乘法运算符号并且实现混合运算
  • 可以考虑如下类:
class Rational{
public:
    Rational(int val): val(val) {}
    Rational() {}
    int get_val() {return val};
private:
    int val;
};
  • 那么重载函数就可以有两种形式:
    • 成员函数形式
    • 非成员函数形式
  • 成员函数形式:
const Rational operator* (const Rational& rhs)
{
    return Rational(val * rhs.get_val());
}
  • 非成员函数形式:
const Rational operator* (const Rational& lhs , const Rational& rhs)
{
    return Rational(lhs.get_val() * rhs.get_val());
}
  • 对于成员函数形式,考虑以下两种情况:
Rational a(10);
Rational b = a * 2;  // true
Rational c = 2 * a;  // err
  • 第一种情况中2可以隐式转换为Rational(就比如 Rational b = 2),但是第二个语句中int类型的变量中没有参数为Rational的重载方法
  • 所以这一种情况下使用非成员函数比较好,所以得到结论,如果想要想要让函数的每一个参数得到隐式类型转换,需要使用非成员函数
  • 另外补充一点,此时的非成员函数不应该被声明为friend方式降低了类的封装程度,而是只依靠public接口中的方法来进行运算操作
  • 总结:
    • 如果你需要为某一个函数的所有参数(包含被this指针所指向的哪一个隐喻参数)进行类型转换,那么这一个函数必须定义为非成员函数(考虑操作的拓展性)