C ++类中int变量的值无法解释

时间:2016-11-20 16:27:53

标签: c++ debugging operator-overloading

我已经在C ++中遇到了几个小时的问题,即使在调试器的帮助下,我也无法弄清楚发生了什么。

我正在尝试创建一个Date课程(不开玩笑)代表日期,包括日期,月份和年份。我还想重载主运算符(++, - ,+ =, - =,+)。

由于我无法看到的原因,除了运算符'+'之外,一切似乎都运行良好。

这是我的头文件:

#include <ostream>

class Date {
public:
    Date(int year, int month, int day);
    ~Date();
    Date(const Date& date);
    Date &operator+(int days);

private:
    int m_year;
    int m_month;
    int m_day;
    friend std::ostream &operator<<(std::ostream &os, const Date &date);
};

这是我的C ++文件:

#include "Date.h"

using namespace std;

Date::Date(int year, int month, int day)
        : m_year(year),
          m_month(month),
          m_day(day)
{}

Date::~Date() {}

Date::Date(const Date &date)
    : m_year(date.m_year),
      m_month(date.m_month),
      m_day(date.m_day)
{}

ostream &operator<<(ostream &os, const Date &date) {
    os << date.m_day << ", " << date.m_month << " " << date.m_year;
    return os;                                                  <---- debug point A
}

Date &Date::operator+(int days) {
    Date newDate(*this);
    newDate.m_day = newDate.m_day + days;
    return newDate;                                             <---- debug point B
}

我的主要档案:

#include "Date.h"
#include <ostream>

using namespace std;

int main(int argc, char *argv[])
{
    Date date(2013, 12, 12);
    cout << date << endl;
    cout << date + 2 << endl;
    return 0;
}

输出是:

12, 12 2013
1359440472, 12 2013

Process finished with exit code 0

我不明白这个1359440472来自哪里!!

我试图放置调试点(如上所示),输出如下:

Debug point A:
    date = {const Date &} 
         m_year = {int} 2013
         m_month = {int} 12
         m_day = {int} 12

Debug point B:
    this = {Date * | 0x7fff5c5ddac0} 0x00007fff5c5ddac0
         m_year = {int} 2013
         m_month = {int} 12
         m_day = {int} 12
    days = {int} 2
    newDate = {Date} 
         m_year = {int} 2013
         m_month = {int} 12
         m_day = {int} 14

Debug point A:
    date = {const Date &} 
         m_year = {int} 2013
         m_month = {int} 12
         m_day = {int} 1549654616

我无法解释!!最后两个调试检查点之间没有任何步骤,“14”已成为“1549654616”......

类型int可能是一个问题(因为它似乎距离2 ^ 24不远)或运算符+有问题,但我看不到如何解决它。

感谢您的帮助, 编

2 个答案:

答案 0 :(得分:1)

你正在返回一个悬空参考。

任何事情都可能发生。

按值operator+返回。

答案 1 :(得分:0)

您将返回对具有自动存储持续时间的变量的引用。

这样做的行为是未定义的。

修复是返回值,而不是引用。依靠命名的返回值优化来避免明显的深层复制。