首页 > 解决方案 > 在 C++ 中使用不同对象类型作为操作数的运算符重载

问题描述

class myClass
{
public:
    int myVal;
    myClass(int val) : myVal(val)
    {

    }
    myClass& operator+(myClass& obj)
    {
        myVal = myVal + obj.myVal;
        return *this;
    }
    myClass& operator+(int inVal)
    {
        myVal = myVal + inVal;
        return *this;
    }
    myClass& operator=(myClass& obj)
    {
        myVal = obj.myVal;
        return *this;
    }
};


int _tmain(int argc, _TCHAR* argv[])
{
    myClass obj1(10);
    myClass obj2(10);
    obj1 = obj1 + obj2;
    obj1 = 20 + obj2; // Error : No matching operands for operator "+"
    return 0;
}

如何将整数和 myClass 对象类型的运算符“+”作为操作数实现?(obj1 = 20 + obj2)

标签: c++operator-overloadingassignment-operatorfriend-function

解决方案


您通常将二进制算术+=复合赋值)运算符实现为成员函数,并+作为使用前者的非成员函数;这允许提供后者的多个重载,例如当自定义二进制算术运算符的两个操作数不属于同一类型时:

class MyClass
{
public:
    int myVal;
    MyClass(int val) : myVal(val) {}
    
    MyClass& operator+=(int rhs) {
        myVal += rhs;
        return *this;
    }
};

inline MyClass operator+(MyClass lhs, int rhs) {
    lhs += rhs;
    return lhs;
}

inline MyClass operator+(int lhs, MyClass rhs) {
    rhs += lhs;
    return rhs;
    // OR:
    // return rhs + lhs;
}

int main() {
    MyClass obj1(10);
    MyClass obj2(10);
    obj1 = 20 + obj2;
    obj1 = obj1 + 42;
}

有关运算符重载的一般最佳实践建议,请参阅以下问答:


推荐阅读