【问题标题】:Overloading operator+ in class在类中重载 operator+
【发布时间】:2015-10-17 10:51:31
【问题描述】:

假设我有一个班级编号

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

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

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

【问题讨论】:

    标签: c++ operator-overloading


    【解决方案1】:

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

    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;
    }
    

    【讨论】:

    • 你的朋友并不总是暴露在公共场合,做朋友可能不是最好的方式。
    【解决方案2】:

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

    这就像说“我当然可以用锤子敲钉子,但我想用螺丝刀......”

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

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

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

    另一种写法是使用operator+= 作为助手(那么你的班级也将支持+=):

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

    有成员函数:

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

    您可以选择让operator+ 返回Numberint

    【讨论】:

      【解决方案3】:

      只需在类外编写一个调用你类中的操作符!

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

      【讨论】:

        猜你喜欢
        • 2010-12-14
        • 2016-03-18
        • 1970-01-01
        • 2012-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多