在 class 中重载 operator+

Overloading operator+ in class

假设我有一个 class 号码

class Number
{
public:
    int numb;

    Number (int g)
    {
        numb = g;
    }

    int operator+(int h)
    {
        return this->numb+h;
    }
};

当我尝试使用重载运算符时

cout << 3 + s; // doesn't work
cout << s + 3;

我明白为什么它不起作用,但我不知道如何让它在 3 + s

上起作用

当然,我可以在 class 之外编写带有 2 个参数的 operator+,但我想让我的运算符在 class 中重载。

我用谷歌搜索了它,但没有找到任何解决方案。

只需在 class 之外写一个运算符,调用 class 中的运算符!

template<typename T> T operator+(T a, Number& n)
{
  return n+a;
}

最简单的方法:在 class

之外编写另一个重载
class Number
{
public:
    int numb;

    Number (int g)
    {
        numb = g;
    }

    int operator+(int h)
    {
        return this->numb+h;
    }
};

int operator+(int h, Number& n)
{
    return n.numb+h;
}

int main()
{
    int s = 42;
    std::cout << 3 + s;
    std::cout << s + 3;
}

Live Example

如果您的数据是私有的,这也有效(但要确保外部函数可以访问这些成员)

class Number
{
    int numb;

public:
    Number (int g)
    {
        numb = g;
    }

    int operator+(int h)
    {
        return this->numb+h;
    }

    friend int operator+(int, Number&);
};

int operator+(int h, Number& n)
{
    return n.numb+h;
}

Of course, I can write operator+ with 2 arguments outside the class, but I want to have my operator overloaded in the class.

这就像在说"Of course I could hammer in my nail with a hammer, but I want to use a screwdriver..."

其他一些解决方案建议同时使用会员和非会员,但这是多余的:如果您添加了非会员,那么您就不再需要会员了!

重载operator+proper way就是使用非成员:

Number operator+(Number a, Number b)
{
    return a.numb + b.numb;
}

另一种写法是使用 operator+= 作为助手(然后你的 class 也将支持 +=):

Number operator+(Number a, Number b)
{
    return a += b;
}

成员函数:

Number &operator+=(Number b)
{
    numb += b.numb;
    return *this;
}

您可以选择 operator+ return Numberint