运算符重载限制 不能重载的运算符

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++库

非成员与成员选择方针:

所有一员运算符 成员
=, (),[], ->, ->* 必须是成员
+=, -=, /=, *=, ^=, &=,%=,>>=, <<= 成员
所有其它二元运算符 非成员

猜你喜欢

转载自blog.csdn.net/yufanghu/article/details/80758281
今日推荐