【问题标题】:Overloading operator= for double重载 operator= 用于双精度
【发布时间】:2014-04-30 18:55:38
【问题描述】:

是否可以重载 double 类型的 = 运算符?

我有以下:

double operator=(double a, Length b) {
    return a = (b.getInches()/12+b.getFeet())*3.2808*0.9144;
}

它会抛出以下错误:

'double operator=(double, Length)' must be a nonstatic member function

我做错了什么?

【问题讨论】:

  • 可能您希望Length 可转换为double 以支持Length a; double b; b = a; 之类的表达式。可转换意味着Length 具有operator double
  • 您真的要重载赋值运算符吗?也许你想重载从Lengthdouble 的转换,在这种情况下你应该重载Length::operator double()...

标签: c++ operator-overloading


【解决方案1】:

您不能为原始类型重载赋值运算符,但您可以提供一个将Length 转换为double 的运算符,从而获得所需的效果:

class Length {
    ...
public:
    operator double() {
        return (getInches()/12+getFeet())*3.2808*0.9144;
    }
};

main() {
    Length len = ...;
    ...
    double d = len;
}

请注意,只有当转换对读者来说完全清楚时,才应进行此转换。例如,在这种情况下,您应该创建一个 get_yard 成员函数,如下所示:

class Length {
    ...
public:
    double get_yards() {
        return (getInches()+12*getFeet())/ 36.0;
    }
};

请注意,您无需将英尺转换为米,然后再转换为码 - 您可以直接从英尺转换为码;转换系数为3.0。您也可以最后进行除法 - 参见上面修改后的表达式。

【讨论】:

  • 最好提一下这种方法的潜在缺点,即模棱两可和各种变通方法。
  • @staticx 我同意,只有在读者完全清楚转换时才应该这样做。如果不是,则应使用成员函数。我编辑了答案以提及这一点。谢谢!
  • @Roddy :):):) 你是对的 - 我将 12 除以 3 而不是乘法(这是在他们只教授公制的国家长大的结果)。不过,我应该检查一下我的数学......谢谢!
【解决方案2】:

您不能为double 等内置(整数或浮点)类型重载运算符,也不能为any 类型全局重载= 运算符。 = 运算符只能作为类成员函数重载。

另见:Can I define an operator overload that works with built-in / intrinsic / primitive types?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多