c++操作符重载Int类型

C++ Operator Overloading Int Types

本文关键字:类型 Int 重载 操作符 c++      更新时间:2023-10-16

我正在c++中编写一个分数类,并在新类中定义了frac和int的添加,但它要求它们以该顺序显示:frac + int。有没有一种方法在Int类型中重载+,这样我们就有了一个接受frac并输出frac的函数?或者有没有办法在新类中颠倒顺序?

我已经定义了frac + frac和frac += frac操作符。这两个函数是:
frac operator+=(int b)
{
    frac c = { n + b*d, d };
    return c;
}
frac operator+(int b)
{
    frac c = *this;
    frac d = { b };
    c += d;
    return c;
}

像这样:

frac int::operator+=(frac& b)
{
    frac c = { this * b.den() + b.num(), b.den() };
    return c;
}

但我不确定如何真正做到这一点。


下面问题的代码:

frac &operator+=(frac b)
{
    frac c = { n * b.den() + b.num() * d, d * b.den() };
    n = c.num();
    d = c.den();
    return *this;
}
frac operator+(int a, frac b)
{
    return frac{ a } += b;
}

没有int类所以你不能做你建议的但简单的事情是声明一个函数像这样(在你的类中)

 friend frac operator+(int a, frac b);

这样,当使用另一个顺序时将调用此函数。编辑:您需要使用friend说明符,因为函数不在类中,我忘了这一点。

这样做的正确方法是使frac具有来自int的隐式构造函数,并使用自由的operator+,以便转换适用于两个参数。你也可以根据+=来实现+等等。例如

struct frac
{
    frac(int x) { /* initialize frac with x */ }
    frac &operator+=(frac f) { /* add f to this */ return *this; }
};
frac operator+(frac f1, frac f2)
{
    return f1 += f2;
}

Update:有些人认为隐式转换构造函数是糟糕的风格;如果你是其中之一,那么你可以通过使用显式构造函数和编写一系列带精确参数的操作符来解决它,例如

frac operator+(int f1, frac f2) { return frac(f1) += f2; }
frac operator+(frac f1, int f2) { return f1 += frac(f2); }
frac operator+(frac f1, frac f2) { return f1 += f2; }

声明成员操作符为静态,可以有两个形参。请参阅WholeNumber的声明——操作符是静态的,没有*this的实例。

Visual Studio中交叉编译对象中的操作符