一、前置知识:运算符重载
在 C++ 中,运算符本质上类似于函数。比如加法操作,相当于调用一个函数,左右操作数就是参数。一元运算符只有一个参数,二元运算符有两个。因此,我们可以像重载函数一样重载运算符,让同一个符号根据操作数的不同调用不同的实现,从而支持多态。
不过要注意,语法内置的运算符不能随意重载。例如两个整型相加的规则是确定的,无法更改。但如果操作数是自定义类型(如类),编译器不知道如何运算,这时就需要我们定义规则。比如日期类加上一个整数,表示增加天数,这就是有意义的重载场景。
运算符重载的核心规则
- 转换机制:当运算符用于类类型对象时,必须转换为对应的重载函数调用,否则编译报错。
- 命名规范:重载函数名由
operator加运算符符号组成,如operator+。它和普通函数一样有返回类型、参数列表和函数体。 - 参数数量:重载函数的参数个数等于运算符作用的操作数数量。一元运算符一个参数,二元运算符两个参数。左侧传给第一个参数,右侧传给第二个。
- 成员函数特性:如果作为成员函数,第一个操作数默认通过隐式的
this指针传递。因此二元运算符作为成员函数时,只需声明一个参数(右操作数)。 - 优先级不变:重载后优先级和结合性与内置类型一致,且不能创建新符号(如
@)。 - 不可重载符号:
.、.*、::、sizeof、?:这五个运算符不能重载。 - 至少一个类类型:重载至少有一个参数必须是类类型,不能改变内置类型的含义(如
int + int)。 - 按需重载:只有重载后有意义的运算符才需要写。例如日期相减有意义,但日期相加通常无意义。
- 自增自减区分:前置 ++ 无参,后置 ++ 多一个
int形参以区分重载。 - 流运算符:
<<和>>建议重载为全局函数,避免this抢占左操作数位置,保证cout << obj的写法自然。
实战示例:日期类相等运算符
我们以日期类的相等运算符为例。返回值应为 bool,参数为另一个日期对象。由于是成员函数,this 指向当前对象,只需传入比较对象。
#include <iostream>
using namespace std;
class Date {
public:
// 构造函数
Date(int year = 2025, month = , day = ) {
->_year = year;
->_month = month;
->_day = day;
}
==( Date& d) {
->_year == d._year &&
->_month == d._month &&
->_day == d._day;
}
:
_year;
_month;
_day;
};
{
;
;
(d1 == d2) {
cout << << endl;
} {
cout << << endl;
}
;
}


