赋值运算符重载
目录
- 赋值运算符重载
- 示例1:
- 示例2:
- 示例3:
- 示例4:
 
 
 
很巧妙的是,在编写这篇文章时(2023年2月27日),再加100天就是6月7日,恰好是今年高考的百日誓师!
 ✍(文章最后会阐述为什么要加100天)
C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。
函数名字为:关键字operator后面接需要重载的运算符符号
函数原型: 返回值类型 operator操作符(参数列表)
示例1:
例如我们在Date类中比较两个日期是否相等:
bool operator==(const Date& d1,const Date& d2)
{
    return d1._year==d2._year
        &&d1._month==d2._month
        &&d1._day==d2._day;
}
即:

这里的:
d1==d2;    //转换成operator==(d1,d2);(由编译器完成)
上述对于比较的结果,可更改为:(注意运算符的优先级)

问题:若属性是私有的,怎么访问呢?

方式一:设置一个共有的get方法
方式二:放到类里面
//更改如下:
bool operator==(const Date& d)
{
    return _year==d._year
        &&_month==d._month
        &&_day==d._day;
}
示例2:
我们再来尝试Date类日期间大于小于的比较:
//放在类里面的
bool operator>(const Date& d)
{
	if (_year > d._year)
	{
		return true;
	}
	else if (_year == d._year && _month > d._month)
	{
		return true;
	}
	else if (_year == d._year && _month == d._month && _day > d._day)
	{
		return true;
	}
	return false;
}
示例3:
Date类日期间的大于等于:
bool operator>=(const Date& d)
{
    //this代表d1的地址,因此对this解引用即指向d1
    //复用上述已经书写的大于和等于的判定
    return *this>d||*this==d;
}
示例4:
日期加天数怎么办呢?(例如算某天过100天之后的日期)
函数名:operator+
参数:(int day)
返回类型:Date
得到每个月的天数;天满了进月,月满了进年
Step1:得到每个月的天数(判定是平年还是闰年)
int GetMonthDay(int year,int month)
{
    static int monthDayArray[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//平年
    if(month==2 && (year%4==0&&year%100!=0)||year%400==0)                //闰年
    {
        return 29;
    }
    else
    {
        return monthDayArray[month];
    }
}
Step2:加上天数
Date operator+=(int day)
{
 	_day+=day;
    //日进
    while(_day>GetMonthDay(year,month))
    {
        _day-=GetMonthDay(year,month);
        _month++;
        //月进
        if(_month==13)
        {
            _year++;
            _month=1;
        }
    }
    return *this;
}
因此结果如下:

很巧妙的是,在编写这篇文章时(2023年2月27日),再加100天就是6月7日,恰好是今年高考的百日誓师!
















