Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 复制构造函数参数为0_C++_Copy Constructor - Fatal编程技术网

C++ 复制构造函数参数为0

C++ 复制构造函数参数为0,c++,copy-constructor,C++,Copy Constructor,我减去两个日期对象,在重载的减号运算符中,我返回我创建的另一个日期类的实例。但由于某种原因,在重载的减号函数完成并从初始化调用复制构造函数之后,参数为0。这是为什么 //日期:h class Date { int month, day, year; Date *datePtr = this; public: Date(); Date(Date &); bool operator==(const Date& obj); bool op

我减去两个日期对象,在重载的减号运算符中,我返回我创建的另一个日期类的实例。但由于某种原因,在重载的减号函数完成并从初始化调用复制构造函数之后,参数为0。这是为什么

//日期:h

class Date
{
    int month, day, year;
    Date *datePtr = this;
public:
    Date();
    Date(Date &);
    bool operator==(const Date& obj);
    bool operator>(const Date& obj);
    Date operator-(const Date& obj);
    Date operator=(const Date& obj);

    friend istream &operator>>(istream& in, Date &obj);
    friend ostream &operator<<(ostream& out, Date &obj);
};
//复制构造函数

Date::Date(Date &obj)
{    /*obj.month, day and year is 0 here but should be the value from return Date instance from overloaded minus function.*/
    cout << "INSIDE COPY CONSTRUCTOR" << obj.month << "/" << obj.day << endl;
    datePtr = new Date;
    (*datePtr).month = obj.month;
    (*datePtr).day = obj.day;
    (*datePtr).year = obj.year;
}
Date::Date(Date&obj)
{/*obj.month、day和year在这里是0,但应该是重载减号函数返回日期实例的值*/

cout您需要将datePtr对象实际保存到副本构造函数中的当前对象。您确实为datePtr设置了月/日/年,但这不会影响对象的当前实例。这是因为(在头文件中),尽管您设置了datePtr=this,但这并不意味着datePtr就是this。它只是指向此的地址(或者说,当前实例化)。调用datePtr=new Date;只是更改datePtr指向的位置,而不是它指向的数据。将复制构造函数更改为类似以下内容:

Date::Date(const Date &obj)
{
    this->month = obj.month;
    this->year = obj.year;
    this->day = obj.day;
}
正如评论中有人指出的那样,成员初始化列表也是一种实现这一点的方法。这里有很多关于为什么要使用它们的内容,一个阅读它们的好地方是:

如果您想查看,下面是使用成员初始化列表时代码的外观:

Date::Date(const Date &obj) : month(obj.month), year(obj.year), day(obj.day)
{
    // Nothing <3
}
Date::Date(const Date&obj):月(obj.month)、年(obj.year)、日(obj.day)
{

//任何
operator=(const-Date&)
都不应返回对
this
的引用,而不是一个全新的
Date
对象。更具体地说,
Date&operator=(const-Date&);
应该是签名。你说操作符=从
Date temp=date1-date2被调用?用
main
函数演示错误。是的,你的
操作符=
,如果被调用,会引起各种各样的悲伤。我问的原因是我认为操作符=只从赋值中被调用,而不是t初始化。
Date temp=date1-date2//initialization
Date temp=date1-date2
注释部分用于注释,而不是答案。我对您的代码进行了注释,如果您碰巧调用了赋值,则会导致问题。在您发布a之前,我们不知道这一点。另外,
Date*
成员是什么无论如何?为什么要对
Date
类进行如此奇怪的实现?太好了!谢谢。但是我看不出用
this
初始化和创建像我这样的新实例之间有什么区别。是因为我没有在复制构造函数中返回新实例吗?执行
this->month=obj.mon之间有什么区别th
vs`month=obj.month`对于这个答案,现在是展示如何使用成员初始化列表的好时机。这是因为,当您创建一个新实例时,您没有对它做任何操作。您确实在堆上有一个对象,它当然有所有正确的数据。事实上,datePtr指向堆上的那个对象。However、 堆上的对象与当前对象无关。它是一个完全独立的新对象(因此使用
new
关键字).
仍指当前对象,其中as-dataPtr不再指当前对象。@当您的原始代码中不需要指针时,您的代码中除了指针之外还存在漏洞和实现问题。也许您应该先解决这些问题,然后再介绍(不需要介绍的)我之所以创建指针,是因为在我的
操作符-
函数中,它在
datetemp=date2-date1
中更改
date2
实例的成员变量值
Date::Date(const Date &obj)
{
    this->month = obj.month;
    this->year = obj.year;
    this->day = obj.day;
}
Date::Date(const Date &obj) : month(obj.month), year(obj.year), day(obj.day)
{
    // Nothing <3
}