C++ 重载运算符+;课堂上

C++ 重载运算符+;课堂上,c++,operator-overloading,C++,Operator Overloading,假设我有一个班号 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; cout只需在类

假设我有一个班号

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;

cout只需在类外编写一个运算符,调用类中的运算符即可

template<typename T> T operator+(T a, Number& n)
{
  return n+a;
}
模板T运算符+(T a、编号和n)
{
返回n+a;
}

最简单的方法:在类外编写另一个重载

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;
}
当然,我可以在类外编写带有2个参数的运算符+,但我希望在类中重载运算符

这就像说“当然我可以用锤子敲入我的指甲,但我想用螺丝刀……”

其他一些解决方案建议同时使用成员和非成员,但这是多余的:如果添加非成员,则不再需要该成员

重载
运算符+
的方法是使用非成员:

Number operator+(Number a, Number b)
{
    return a.numb + b.numb;
}
编写此代码的另一种方法是使用
操作符+=
作为助手(这样您的类也将支持
+=
):

具有成员功能:

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

您可以选择使用
operator+
返回
Number
int

你的朋友并不总是暴露在公众面前,建立友谊可能不是最好的方式。
Number operator+(Number a, Number b)
{
    return a += b;
}
Number &operator+=(Number b)
{
    numb += b.numb;
    return *this;
}