1.重载后的运算符必须至少有一个操作符是用户定义的类型。
2.使用运算符不能违反运算符原来的句法规则。
3.不能新建运算符
4.不能重载: sizeof , . , .* , :: , ?: , const_cast, dynamic_cast, reinterpret_cast, static_cast
5.只能通过成员函数重载的运算符: = , ( ) , [ ] , ->
限制说明:
函数重载(多态)是用户可以定义多个名称相同但返回列表或参数列表不同的函数,运算符重载将函数重载概念扩展到了运算符上
重载是为了让用户更方便的实现自己所需要的额外功能,扩展用户自定义的类型。如果一个重载运算符造成了混淆,或者不符合大多数人的认知,例如将-(减号)重载为两个操作数相加的结果,这样的重载是没有意义的。
一下对以上几条进行解释:
1.显而易见,标准的运算符重载没有必要,如果不是对自定义类型进行扩展,重载就会造成混淆,例如:对两个double重载+(加),无论实现为什么结果,对其它人来说,都是莫名其妙的,因为对大众来说+(加)就是两个数的相加
2,3.同上,维护的成本远高于创新的成本,对3来说,新运算符无法确定其优先级
4.这几个操作符,前面几个在底层或者在类中都是普遍使用的,在c中也有普遍使用,除了造成混淆以外,这几个操作运算符使用起来语义类型都是比较明确的,sizeof提供数据所分配的内存大小,c++中 static_cast,const_cast,reinterpret_cast几个是类型转换,操作的是对象,如果重载了有可能会破坏原来的安全机制
5.如果定义为非成员,编译器会报错。即使可以定义为非成员,举例“=”,也就是试图定义内置“=”,编译器依然会通过强制operator=为成员函数
补充:
operator<<或>>应该为非成员运算符,因为输出输入流是一个基本c++库
非成员与成员选择方针:
所有一员运算符 | 成员 |
=, (),[], ->, ->* | 必须是成员 |
+=, -=, /=, *=, ^=, &=,%=,>>=, <<= | 成员 |
所有其它二元运算符 | 非成员 |