【问题标题】:In C++, is it possible to define a function (not a method) overloading an operator?在 C++ 中,是否可以定义重载运算符的函数(而不是方法)?
【发布时间】:2021-05-16 16:59:05
【问题描述】:

我知道在 C++ 中如何定义重载运算符的类的方法,我想知道是否可以使用函数名定义函数(不是方法,甚至不是类的友元函数)。例如,operator==

显然,这样的函数将接受两个相同类型的参数,并返回一个布尔值。

例如,我尝试定义这个愚蠢的函数:

char operator*(char C1, char C2){
  return ';';
}

g++ 编译器的回答是:

错误:重载的 'operator*' 必须至少有一个类或枚举类型的参数

【问题讨论】:

  • "重载的 'operator*' 必须至少有一个类或枚举类型的参数" - 很清楚,不是吗?你明白编译器在告诉你什么吗?您不能为内置类型重载运算符。
  • 是的,这是可能的,但是对于像char 这样的原始类型,你不能这样做。其中一个参数必须是classstructenum 或(不确定)union
  • 创建一个包含单个字符的结构并使用该结构代替字符。
  • @Abel 如果该结构有一个采用 char 的构造函数,您甚至可能会获得隐式转换以对您有利。
  • 和一个用于 char 的运算符以获取隐式转换。

标签: c++ operator-overloading


【解决方案1】:

正如您在cppreference 中看到的,您可以将多种类型的运算符重载定义为函数(而非方法),如下所示:

#include <iostream>
 
class Fraction
{
    int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); }
    int n, d;
public:
    Fraction(int n, int d = 1) : n(n/gcd(n, d)), d(d/gcd(n, d)) { }
    int num() const { return n; }
    int den() const { return d; }
    Fraction& operator*=(const Fraction& rhs)
    {
        int new_n = n * rhs.n/gcd(n * rhs.n, d * rhs.d);
        d = d * rhs.d/gcd(n * rhs.n, d * rhs.d);
        n = new_n;
        return *this;
    }
};

std::ostream& operator<<(std::ostream& out, const Fraction& f)
{
   return out << f.num() << '/' << f.den() ;
}

bool operator==(const Fraction& lhs, const Fraction& rhs)
{
    return lhs.num() == rhs.num() && lhs.den() == rhs.den();
}

bool operator!=(const Fraction& lhs, const Fraction& rhs)
{
    return !(lhs == rhs);
}

Fraction operator*(Fraction lhs, const Fraction& rhs)
{
    return lhs *= rhs;
}
 
int main()
{
   Fraction f1(3, 8), f2(1, 2), f3(10, 2);
   std::cout << f1 << " * " << f2 << " = " << f1 * f2 << '\n'
             << f2 << " * " << f3 << " = " << f2 * f3 << '\n'
             <<  2 << " * " << f1 << " = " <<  2 * f1 << '\n';
}

并且某些运算符必须定义为方法,例如operator=。如果您想了解更多详细信息,可以查看 C++ 标准或一些参考资料,如 cppreference

【讨论】:

    猜你喜欢
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 2015-01-01
    • 2010-10-20
    • 2010-10-21
    • 2014-02-22
    • 1970-01-01
    相关资源
    最近更新 更多