对象产生和消亡的行为,可以通过构造函数和析构函数来约定。不仅如此,C++语言还允许约定对象在运算时的行为方式。例如,在日期问题中,我们利用CDate类的成员函数diff来计算两个日期之间的间隔天数,其程序代码如下,
CDate date1(2005), date2(2008);
int span =date1.diff(date2); //计算date1和date2的间隔
但是,实际上我们更愿意采用符合使用习惯的减法运算符来书写代码,例如,
int span = date1 – date2; //计算date1和date2的间隔
这两种书写方式是在语义上是等价的。也就是说,我们应该为CDate类对象定义一种特殊的函数,其函数名是减法运算符“–”,约定其减法运算的行为。
CDate类对象的减法运算的行为,显然不同于减法操作符原始的行为,即需要重新约定减法操作符的运算行为,C++语言称之为重载运算符或操作符。
重载操作符:有两种可选的重载方式(成员函数或者非成员函数)
操作符的运算行为,就是对数据的处理过程,是一个函数。因此,重载操作符就是定义函数,只不过函数的名字比较特殊:“operator操作符”;而使用操作符,则只是形式简化的函数调用而已。例如,计算date1和date2间隔天数的减法表达式,
int span = date1 – date2;
实际上就是形式简化的函数调用,等价于如下形式的成员函数调用,
int span = date1.operator–(date2); //成员函数,或者
或者,等价于如下形式的非成员的全局函数调用,
int span = operator–(date1, date2); //非成员函数
从函数调用的形式反向推演,不难看出,希望对象具有减法运算的行为能力,即重载减法操作符,就需要为对象定义一个成员函数,或者定义一个非成员的全局函数,函数的名字为“operator–”,这两个函数的定义框架分别如下:
int CDate::operator–(CDate date) { …… } //成员函数
int operator–(CDate date1, CDate date2) { …… } //全局函数
C++语言提供了成员函数和非成员函数两种方式进行操作符重载工作。

