个人主页:Jason_from_China-CSDN博客
所属栏目:C++系统性学习_Jason_from_China的博客-CSDN博客
所属栏目:C++知识点的补充_Jason_from_China的博客-CSDN博客
这里有坑,这里有坑,这里有坑
首选我们直接上代码,因为代码是很简单的,但是有一些语法结构是有坑的
//日期之间相差多少天 int Date::operator-(const Date& d)const {//这里采取假设法,假设this是大的,如果不是,则进行转换Date max = *this;Date min = d;int flag = 1;if (*this < d){max = d;min = *this;flag = -1;}int cout = 0;while (max != min){++min;++cout;}return cout* flag; }//测试 int main() {Date ret6 = d6 + 10000;ret6.print();//首先,编译器尝试寻找一个可以处理d6 + 10000的操作符重载函数,比如operator + (int),//如果没有找到这样的函数。//然后,编译器可能会尝试将d6 + 10000解释为d6.operator+(Date(10000)),//也就是先通过单参数构造函数将整数10000转换为一个临时的Date对象,//然后再尝试调用可能存在的operator + (const Date&)成员函数来执行加法操作。//// 两个解决办法// 1, explicit Date(int value);//使用explicit关键字后,编译器将不会自动使用这个单参数构造函数进行隐式类型转换,从而避免了意 外的行为。// 2,加上const修饰//测试日期类的减等和减Date d7;d7 -= 10000;d7.print();Date d8(2000,1,1);Date ret8 = d8 - 1000; //原因是:1000但参构造成为了Date对象,导致调用不明确 禁止掉可以解决折扣的问题ret8.print(); //如果你给那个函数加上了const就只有const对象可以调用 不会出现调用不明确了RETURN 0; }逻辑注意:
- 首先我们实现逻辑的时候,不能真的这个用日期和日期直接相互减减,因为那样会很麻烦
- 所以我们可以直接利用追击问题,当数值一样的时候,我们就可以跳出循环
实现逻辑
- 首先进行大小判断和初始化:
Date max = *this;和Date min = d;以及int flag = 1;这几行代码假设当前对象(*this)是较大的日期,将其赋值给max,传入的参数对象d赋值给min,并设置标志变量flag为 1。- 如果当前对象实际上小于传入的对象,即
*this < d,则进行交换:max = d;和min = *this;,同时将标志变量flag设为 -1。这样确保max始终是较大的日期,min始终是较小的日期。- 然后计算日期差:
- 使用一个循环
while (max!= min),只要两个日期不相等就继续循环。- 在循环中,每次将较小的日期
min递增一天(这里假设Date类实现了自增运算符++,使其能够正确地增加一天,同时处理月份和年份的变化),并将天数计数器cout加一。- 当两个日期相等时,循环结束。
- 最后返回结果:
- 将天数计数器
cout乘以标志变量flag,得到最终的日期差。如果一开始假设正确,即当前对象较大,那么返回正数的日期差;如果当前对象较小,返回负数的日期差。这里有坑的点:
所以还是回到那一句话,const应加尽加

