2014-02-20 42 views
-2

我写一个简单的程序C++运算符重载显示奇怪的行为

#include <iostream> 

using namespace std; 

class Interval 
{ 
public: 
    Interval(int m_input, int s_input) 
    { 
     minutes = m_input + s_input/60; 
     seconds = s_input % 60; 
    } 

    void Print()   const 
    { 
     cout << minutes << " : " << seconds << endl; 
    } 

    int GetSeconds()  const 
    { 
     return 60 * minutes + seconds; 
    } 

    Interval& operator+(const Interval& rhs) 
    { 
     minutes = this->minutes + rhs.minutes; 
     seconds = this->seconds + rhs.seconds; 
     return Interval(minutes, seconds); 
    } 

    Interval& operator-(const Interval& rhs) 
    { 
     int totalSeconds = this->GetSeconds() - rhs.GetSeconds(); 
     return Interval(0, totalSeconds); 
    } 

private: 
    int minutes; 
    int seconds; 
}; 

int main() 
{ 
    Interval t1(7, 45); 
    t1.Print(); 
    Interval t2(3, 75); 
    t2.Print(); 
    Interval t3 = t1 + t2; 
    t3.Print(); 
    Interval t4 = t3 - t1; 
    t4.Print(); 
    return 0; 
} 

它的输出是 7:45 4:15 12:0 0:0 < --------- - 请注意这一个。

但要在我们的程序有些变化时,像

#include <iostream> 

using namespace std; 

class Interval 
{ 
public: 
    Interval(int m_input, int s_input) 
    { 
     minutes = m_input + s_input/60; 
     seconds = s_input % 60; 
    } 

    void Print()   const 
    { 
     cout << minutes << " : " << seconds << endl; 
    } 

    int GetSeconds()  const 
    { 
     return 60 * minutes + seconds; 
    } 

    Interval& operator-(const Interval& rhs) 
    { 
     int totalSeconds = this->GetSeconds() - rhs.GetSeconds(); 
     return Interval(0, totalSeconds); 
    } 

private: 
    int minutes; 
    int seconds; 

    friend Interval& operator+(const Interval& lhs, const Interval& rhs); 
}; 

Interval& operator+(const Interval& lhs, const Interval& rhs) 
{ 
    int minutes = lhs.minutes + rhs.minutes; 
    int seconds = lhs.seconds + rhs.seconds; 
    return Interval(minutes, seconds); 
} 

int main() 
{ 
    Interval t1(7, 45); 
    t1.Print(); 
    Interval t2(3, 75); 
    t2.Print(); 
    Interval t3 = t1 + t2; 
    t3.Print(); 
    Interval t4 = t3 - t1; 
    t4.Print(); 
    return 0; 
} 

它显示输出 7:45 4:15 12:0 4:15 --->看它这个就是我不”知道:(请搭乘飞机。

感谢您的帮助

维沙尔

+3

你打算让我精神上'差异'这两个程序?你不能再进一步缩小问题吗? –

回答

4

你的第一个版本的修改成员变量,当它不应该:在修改Interval进行

Interval& operator+(const Interval& rhs) 
{ 
    minutes = this->minutes + rhs.minutes; 
    seconds = this->seconds + rhs.seconds; 
    return Interval(minutes, seconds); 
} 

随后的减法运算。

你的第二个版本不进行此修改到成员变量:

Interval& operator+(const Interval& lhs, const Interval& rhs) 
{ 
    int minutes = lhs.minutes + rhs.minutes; 
    int seconds = lhs.seconds + rhs.seconds; 
    return Interval(minutes, seconds); 
} 

此外,在这两种情况下,你正在返回一个局部变量,这是错误的引用。

+1

嗨,我很穷解释 – Vishal

+0

@Vishal:对不起? –

1

这些运营商

Interval& operator+(const Interval& rhs) 
{ 
    minutes = this->minutes + rhs.minutes; 
    seconds = this->seconds + rhs.seconds; 
    return Interval(minutes, seconds); 
} 


Interval& operator-(const Interval& rhs) 
{ 
    int totalSeconds = this->GetSeconds() - rhs.GetSeconds(); 
    return Interval(0, totalSeconds); 
} 

无效。他们返回对本地对象的引用,这些对象将在操作员完成其作品后被销毁。

另外,在第一运营商更改了第一个操作数

minutes = this->minutes + rhs.minutes; 
    seconds = this->seconds + rhs.seconds; 

的数据成员,因为这些陈述分钟和秒相当于这个 - >分这个 - >秒

改变他们的以下的方式

Interval operator +(const Interval& rhs) const 
{ 
    int minutes = this->minutes + rhs.minutes; 
    int seconds = this->seconds + rhs.seconds; 
    return Interval(minutes, seconds); 
} 

Interval operator -(const Interval& rhs) const 
{ 
    int totalSeconds = this->GetSeconds() - rhs.GetSeconds(); 
    return Interval(0, totalSeconds); 
}