使用递减运算符编写c ++代码时的奇怪行为

时间:2017-04-11 15:46:38

标签: c++

我是c ++的初学者,我在编码时遇到一个奇怪的代码,下面是问题。

 class INT
{
    friend ostream& operator<<(ostream& os, const INT &i);

public:
    INT(int i) :m_i(i){};
    INT(const INT& i)
    {
        m_i = i.m_i;
    }
    INT& operator++()
    {
        ++(this->m_i);
        return  *this;
    }
    const INT operator++(int)
    {
        INT temp = *this;
        ++(*this);
        return temp;
    }
    INT& operator--()
    {
        --(this->m_i);
        return  *this;
    }
    const INT& operator--(int)
    {
        INT temp = *this;
        --(*this);
        return temp;
    }
    int& operator*() const
    {
        return (int&)m_i;
    }
private:
    int m_i;
};

ostream& operator<<(ostream& os, const INT &i)
{
    os << "[" <<i.m_i<< "]";
    return os;
}

int main(int argc, char* argv[])
{
    INT i(5);
    cout << i++;
    cout << ++i;
    cout << (i--);
    cout << --i;
    cout << *i;
}

我得到了一个结果

[5][7][-858993460][5]5

我的预期结果是

[5][7][7][5]5

我正在使用Visual Studio 2013.非常感谢!

1 个答案:

答案 0 :(得分:6)

const INT& operator--(int) { ... }

错了。您将返回对函数范围中的对象的引用。函数返回后引用变为无效。将其更改为:

INT operator--(int) { ... }

在此期间,您不需要const in:

const INT operator++(int) { ... }

将其更改为:

INT operator++(int) { ... }