运算符重载 笔记2

两种方式的区别

区别:

  1. 使用成员函数来实现运算符重载时,少写一个参数,因为第一个参数就是this指针。

 

两种方式的选择:

  1. 一般情况下,单目运算符重载,使用成员函数进行重载更方便(不用写参数)
  2. 一般情况下,双目运算符重载,使用友元函数更直观

方便实现a+b和b+a相同的效果,成员函数方式无法实现。

   例如: 100 + cow;   只能通过友元函数来实现

 cow +100;    友元函数和成员函数都可以实现

特殊情况:

(1)    = () [ ]  -> 不能重载为类的友元函数!!!(否则可能和C++的其他规则矛盾),只能使用成员函数形式进行重载。

(2)如果运算符的第一个操作数要求使用隐式类型转换,则必须为友元函数(成员函数方式的第一个参数是this指针)

 

注意:

同一个运算符重载, 不能同时使用两种方式来重载,会导致编译器不知道选择哪一个(二义性)

运算符重载的禁区和规则

1. 为了防止对标准类型进行运算符重载,
C++规定重载运算符的操作对象至少有一个不是标准类型,而是用户自定义的类型

   比如不能重载 1+2

   但是可以重载  cow + 2 和 2 + cow   // cow是自定义的对象

2.不能改变原运算符的语法规则, 比如不能把双目运算符重载为单目运算

3.能改变原运算符的优先级

4.不能创建新的运算符,比如 operator**就是非法的, operator*是可以的

5.不能对以下这四种运算符,使用友元函数进行重载

   = 赋值运算符,()函数调用运算符,[ ]下标运算符,->通过指针访问类成员

6. 不能对禁止重载的运算符进行重载

不能被重载的运算符

成员访问

.

域运算

::

内存长度运算

sizeof

三目运算

 ? : :

预处理

#


可以被重载的运算符

 

双目运算符

+    -    *    /    %

关系运算符

==  !=   <   <=   >   >=

逻辑运算符

&&  ||    !

单目运算符

+(正号)   -(负号)  *(指针)  &(取地址)  ++   --

位运算

&    |   ~    ^    <<(左移)    >>(右移)

赋值运算符

=   +=   -=    *=   /=   %=  &=  |=  ^=  <<=   >>=

内存分配

new   delete  new[ ]   delete[ ]

其他

( )  函数调用

-> 成员访问
[ ]   下标

,  逗号

posted @ 2020-06-11 09:37  CollisionDimension  阅读(109)  评论(0)    收藏  举报