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