过载运算符" +"在c ++中取决于参数

时间:2014-11-27 17:20:38

标签: c++ class overloading reload operator-keyword

让我们考虑一下

我们已经创建了自己的类Array。现在我们想要重载“+”运算符,以便:if:

Array a(5), b(3);
Array c = a + b;

它只是将数组和b数组粘在一起,我们得到一个长度为5 + 3 = 8的c数组。

现在,我已经意识到这个案例写在我的Array.cpp文件中:

Array Array::operator+(const Array &Right)
{
Array temp_A(m_iCurInd+Right.m_iCurInd);
// here some stuff, not important to the quastion// 
return temp_A;
}

一切都很好。

但是,如果我想:

Array a(5);
Array c = a + 2;
Array d = 2 + a;

因此d和c的长度为6,开头和结尾分别为“2”?

我试过

实现第一种情况,所以在Array.h文件中就是这样一行:

Array operator+(const int &value); //a+2

在Array.cpp中:

Array Array::operator+(const int &value)
{
 Array temp_A(m_iCurInd+1);
 // here some stuff, not important to the quastion//
 return temp_A;
}

但它没有编译,因为它不喜欢这些类型(特别是const int& I think)。我怎么做壳?壳牌是:

Array int::operator+(const Array &Right){
....
}

对于“2 + a”案件或类似的事情?请告诉我。

3 个答案:

答案 0 :(得分:2)

您可以这样做:

class Array
{
    // ...

    // Insert an Element
    public:
    void prepend(int);
    void append(int);

    // Append an Array
    void append(const Array&);

    // ...
};

inline Array operator + (const Array& a, const Array& b) {
    Array result(a);
    result.append(b);
    return result;
}

inline Array operator + (const Array& a, int b) {
    Array result(a);
    result.append(b);
    return result;
}

inline Array operator + (int a, const Array& b) {
    Array result(b);
    result.prepend(a);
    return result;
}

答案 1 :(得分:1)

您可以将operator +定义为非成员函数,以支持混合模式算法。

Array operator+( const Array &arr1, const Array &arr2 )

然后为要支持混合模式算术的类型提供适当的单个参数构造函数。

答案 2 :(得分:0)

要允许语法Array + int,您有两个选择:创建operator+的成员函数重载,其中参数是一个整数,或者创建一个参数为{operator+的免费Array分别为{1}}和int。看起来您已经为成员函数重载正确地完成了它,但为了确保它看起来像这样:

class Array
{
    // ...
    Array operator+(int rhs)
    {
        // ...
    }
};

现在Array + int应该有效。如果它没有,你在功能中做错了什么。

要允许语法int + Array,您需要一个免费的运算符函数,因为成员函数不会为左侧重载int

Array operator+(int lhs, Array const& rhs)
{
    return rhs + lhs;
}

rhs + lhs调用成员函数重载Array::operator+()