C++/C都有一套固定的运算符集合,其中不乏比较特殊的运算符例如‘++’和‘—’虽说本质上运算符重载和函数重载没什么不同,但是还是有一些特殊性需要注意:
1. 如果重载成为成员函数,则this对象发起对它的调用。
2. 如果重载为全局函数,则第一个参数发起对它的调用。
3. 禁止用户发明该语言运算集合中不存在的运算符。
4. 除了函数调用运算符‘()’外,其他运算符函数重载函数不能有默认参数值。
5. 不要试图改变重载运算符的语义,要与其内置语义保存一致。如果你把‘++’运算符重载后让它执行递减操作,重载‘<<=’和‘>>=’执行I/O操作等,都会损害程序的可理解性,得不偿失。
6. 某些运算符之间可以相互推导,比如在逻辑运算符之间和关系运算符之间,这样我们可以只实现少数几个运算符,然和在用它们来实现其他运算符。
例如,我们可以用‘!’和‘&&’来实现‘||’我们也可以用‘<’来实现‘==’、 ‘>’、 ‘>=’、 ‘<=’、 ‘!=’、或者单独实现‘==’、然和和‘<’、组合来实现其他运算符等。
不能重载的运算符
在C++运算符集合中,有一些运算符是不允许重载的,一方面是因为它们的右侧操作数是一个名字而不是对象,另一方面是出于安全性的考虑,可防止产生错误和混乱。
l 不能重载‘。’,因为它在ADT/UDT中对任何成员都有意义,已成为标准用法。
l 不能重载反引用类成员指针。‘*’。
l 不能重载作用域解析运算符。‘::’;
l 不能重载那个唯一的三元运算符——条件运算符‘?:’;
l 不能重载sizeof()和typeid();
l 不能重载C++的新式类型转换运算符:static_cast<>、dynamic_cast<>、const_cast<>、reinterpret_cast<>。
l 不能重载‘#’和‘##’等预处理操作符。