【问题标题】:Operator overloading with different object types as operands in C++使用不同对象类型作为 C++ 中的操作数的运算符重载
【发布时间】:2021-03-12 12:37:25
【问题描述】:
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-overloading assignment-operator friend-function


【解决方案1】:

您通常将二进制算术 += (compound-assignment) 运算符实现为成员函数,并将 + 作为使用前者的非成员函数;这允许提供后者的多个重载,例如就像您的情况一样,当自定义二进制算术运算符的两个操作数不是同一类型时:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    • 2020-02-28
    • 2016-05-28
    • 2017-10-12
    相关资源
    最近更新 更多