运算符重载没有多高深复杂,但牵扯到的相关概念和语法变化不少,如果这块基石不牢固,读复杂C++代码时就只有雾里看花的份。
运算符重载由来
C/C++中所有运算符(+-*/等)默认只用于标准数据类型(int float double等),而对自定义的struct/class通常不适用,如:
typedef struct TIMETAG
{
int hours;
int minutes;
//int *days; ①
}duration;
duration a,b, sum;
a.hours =2; a.minutes = 30;
//days =malloc(4); ②
b.hours = 1; b.minutes=10;
sum = a +b; //不成立
直接sum=a+b是美好的愿望,但编译器事先不知道自定义结构体里有哪些成员,也不知道+号功能应该针对哪些(全部?有指针也直接加?),让编译器怎么翻译这个+号?只能自定义函数:
duration add(duration a, duration b){
duration sum;
sum.hours =a.hours+b.hours;
sum.minutes =a.minutes+b.minutes;
//*(sum.days)=*(a.days) +*(b.days); ③
return sum;
}
倒是有两个操作符默认可以用于struct/class:=和&,如sum=a;等价于memcpy(&sum,&a, sizeof(duration));是对=号默认的运算符重载,实现了浅拷贝(相关浅拷贝、深拷贝、拷贝构造函数以及默认=号运算符重载等概念的联系与区别另文讨论),这已是编译器能力极限,它没法进一步给出其他运算符用于struct/class对象时的默认实现,如上例对sum=a+b不知怎么操作指针days③,最后还是要用户自定义函数。C++规定可用operator+()代替上例的add函数实现"+"号运算符对应的加法语义,比如对sum=a+b,编译器支持用函数”operator+()”自动替换表达式里的”+”号,使程序员能像对待标准数据一样去操作类对象,