【问题标题】:Operator overloading with different datatypes in C++C++中不同数据类型的运算符重载
【发布时间】:2019-04-01 11:10:35
【问题描述】:

以此为例:

float operator+(int a, float b)
{
   Return b + (float)a;
}

void main()
{
    int a = 10;
    float b = 2.5f;
    float c;

    c = a + b; //works as intended
    c = b + a; //results in type mismatch error
}

所以我的问题: 有没有办法在不定义第二个函数的情况下双向接受参数?

【问题讨论】:

  • 改用 C++ 模板。或将int a 更改为float a
  • 你为什么要大写Return?不,您需要定义第二个,因为该语言不假设您的运算符。此外,您可能不想为 int 和 float 重载该运算符,这可能会使您的代码难以阅读,因为您不希望在添加两个数字时调用自定义函数。
  • 你需要两个运算符,它不能以“双向”方式工作。
  • 根据经验,您不应该乱用不属于您的类型。从这个意义上说,您的示例不是一个好的示例,因为解决此特定问题的方法是首先不为intfloat 实现您自己的operator+,然后+ 将按预期工作: P
  • 在标准 C++ 中不可能重载 operator+(),除非至少有一个操作数是类类型。标准不允许接受两个基本类型参​​数的operator+() 的所有重载(例如float operator+(int a, float b))。如果您的编译器允许这样做,则它是一个非标准扩展。也就是说,获得“双向”运算符的唯一方法是提供两个重载。

标签: c++ operator-overloading


【解决方案1】:

不能为基本类型重载运算符。 您应该只为您定义的类重载运算符。

为您自己的类对称重载具有异构参数的二元运算符的解决方案是为第一种类型定义运算符,并使第二种类型隐式转换为第一种类型。

【讨论】:

    【解决方案2】:

    使用 float 'a' 而不是 int 'a',默认情况下,当添加 int 数字以浮动时,它会自动分配更高的精度。 (int + float 结果变为 float)

    【讨论】:

    • 对于给定的示例,这从字面上回答了这个问题,但我想intfloat 仅用于示例。考虑operator+(Foo f,Bar b)(以及FooBar 没有明显公共类型的情况)
    • 但是如果你从字面上理解这个问题,那么首先写一个operator+是完全没有意义的。编写一个添加两个浮点数的函数不应通过任何代码审查
    猜你喜欢
    • 1970-01-01
    • 2014-06-02
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多