1 为什么要运算符重载
当我们想进行两个自己创建的类比较时,这个时候" == "不会起作用了,因为这个符号是当我们比较基本内置数据时,系统已经给我们封装好了,可是我们自己创建的类型,系统可没有封装好,所以就需要运算符重载
2 运算符重载示例
class Date {
public:
Date(int year = 0, int month = 1, int day = 1) {
_year = year;
_month = month;
_day = day;
}
int _year;
int _month;
int _day;
};
bool operator == (Date& d1, Date& d2) {
return d1._year == d2._year
&& d1._month == d2._month
&& d1._day == d2._day;
}
int main() {
Date d1(2024, 4, 3);
Date d2(2024, 4, 2);
//d1 == d2// 当没有定义运算符时,这个会报错
d1 == d2; //等价与 operator == (d1, d2);
operator == (d1, d2);//但是我们一般不这么写,可读性差
return 0;
}
这个方法是当类中的成员变量是公有的时候才可以用,但我们类里面的成员变量一般是私有的。那么我们应该将这个函数定义为类中的成员函数,像这样:
class Date {
public:
Date(int year = 0, int month = 1, int day = 1) {
_year = year;
_month = month;
_day = day;
}
/*bool operator == (Date& d1, Date& d2) {// 这样不行,因为这里只能有两个参数
* 这里还隐藏了一个this指针
return d1._year == d2._year
&& d1._month == d2._month
&& d1._day == d2._day;
}*/
bool operator == (const Date& d) { //这里等价于
//bool operator == (Date* this, const Date& d)
return _year == d._year //等价与this->_year == d._year
&& _month == d._month
&& _day == d._day;
}
private:
int _year;
int _month;
int _day;
};
int main() {
Date d1(2024, 4, 3);
Date d2(2024, 4, 2);
d1 == d2; //等价与 d1.operator == (&d1, d2);
d1.operator==(d2);//隐藏了this指针
return 0;
}