C++运算符重载

本文详细介绍了C++中运算符重载的两种方式——成员函数和友元函数,以及它们的区别和适用场景。成员函数通常用于单目运算符,友元函数适合双目运算符,尤其是需要考虑不同顺序的运算。特别地,赋值运算符、函数调用、下标和指针访问成员不能用友元函数重载。同时,不能改变运算符的语法、优先级或创建新运算符。最后,列举了可重载和不可重载的运算符,并给出了实例代码展示如何实现运算符重载。
摘要由CSDN通过智能技术生成

两种方式的区别

区别:

  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.不能改变原运算符的语法规则, 比如不能把双目运算符重载为单目运算

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

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

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

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

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

不能被重载的运算符

成员访问

.

域运算

::

内存长度运算

sizeof

三目运算

 ? : :

预处理

#


可以被重载的运算符

双目运算符

+    -    *    /    %

关系运算符

==  !=   <   <=   >   >=

逻辑运算符

&&  ||    !

单目运算符

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

位运算

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

赋值运算符

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

内存分配

new   delete  new[ ]   delete[ ]

其他

( )  函数调用

-> 成员访问
[ ]   下标

,  逗号

Boy(int salary);

Boy(const char* name);

Boy& operator=(const Boy& boy);

bool operator>(const Boy& boy);

bool operator<(const Boy& boy);

bool operator==(const Boy& boy);

// 下标运算符的重载

int operator[](std::string index);

int operator[](int index);

// 该方式不适合

//ostream& operator<<(ostream& os) const;

friend ostream& operator<<(ostream& os, const Boy& boy);

friend istream& operator>>(istream& is, Boy& boy);

// 特殊的运算符重载:类型转换函数,不需要写返回类型

operator int() const;

operator char* () const;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值