提问者:小点点

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

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


共1个答案

匿名用户

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

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

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

  • 运算符重载的基本规则和习惯用法是什么?

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|中|对象|类型|操作数|运算符|重载)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?