如何添加标准和用户定义的对象?

时间:2012-01-16 11:03:59

标签: c++

您好我正在尝试为+(加法)运算符执行运算符重载以添加用户定义的数据类型对象。 以下是该代码。

  #include <iostream>
using namespace std;
class complex {
    int i;
    double f;
public:
    complex(int ii=0,double ff=0){
        i = ii;
        f = ff;
    }
    complex operator+(complex object) {
        complex result;
        result.i = this->i + object.i;
        result.f = this->f + object.f;
        return result;
    }
    void display() {
        cout << i <<"\t"<< f;
        cout << endl;
    }
};
int main(){
    complex obj1(1,1.1),obj2(2,2.2),obj3;
    int i(5);
    obj3 = obj1 + obj2;
    obj3.display();
    obj3 = obj3 + i;
    obj3.display();
    obj3 = i + obj3;//generates me compiler error
    obj3.display();
    return 0;
}

我了解到当我做obj1 + obj2时,它被编译器扩展为obj1.operator +(obj2); 所以这部分代码工作正常。

但是当我添加一个int和complex时,我认为它会扩展为i.operator(obj1)。

所以它给了我编译错误。

我应该在int类中定义operator +函数还是如何解决这个问题? 请建议, 谢谢,

3 个答案:

答案 0 :(得分:3)

您必须提供+的重载版本,该版本将int和类complex对象作为输入参数。此函数应该是非成员函数。

complex operator+(int i, complex object) 

另请注意,如果您想要访问此重载功能中的protectedprivate成员,则必须将friend类设为complex。< / p>

这是用于运算符重载的自由函数强度的一个特殊示例,与成员函数运算符重载相反。

答案 1 :(得分:2)

这就是为什么operator+通常被定义为自由函数的原因:你可以(应该)定义一个自由函数而不是complex complex::operator+(complex object)

complex operator+(const & complex lhs, const & complex rhs)
{
    return complex(lhs.i + rhs.i, lhs.j + rhs.j);
    // You will need some way to access i and j, either by making this function
    // a friend of complex or by providing getters
}

这样,行obj3 = i + obj3将等同于operator+(i, obj3);由于您编写的构造函数可以将整数转换为复数,因此调用将成功并与此相同:operator+(complex(i), obj3)

根据经验,当左侧和右侧大小具有相同的重要性时,您应该更喜欢自由函数而不是成员函数来重载二元运算符。这样,您知道如果a op b有效,那么b op a也会有效。

在旁注中,您还应该更喜欢将参数作为reference-to-const传递,并将成员函数标记为const(如示例中的operator+display)。< / p>

答案 2 :(得分:0)

在任何类之外定义一个函数:

complex operator + (int lhs, complex rhs) { /* ... */ }

确保编译器可以看到它,并且您可以为复合物添加内容。你可能也想要一个带参数的方法。