2017-04-11 47 views
3

我是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年。非常感谢您!

回答

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

是错误的。您正在返回对函数范围内的对象的引用。函数返回后引用变为无效。将其更改为:

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

虽然它,你不需要const在:

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

将其更改为:

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

任何想法,为什么它没有失败对于返回'INT&'的'++'运算符也是如此。因为他们都是UB,所以只是愚蠢的运气? – Barmar

+0

@Barmar OP的帖子中的'++'操作符返回一个'const INT',而不是'const INT&' –

+0

@king_nak对,我看的是错误的。 – Barmar