C++运算符重载
文章目录
参考 https://blog.csdn.net/lishuzhai/article/details/50781753
参考 https://blog.csdn.net/weixin_42837024/article/details/82496017
参考 https://wizardforcel.gitbooks.io/w3school-cpp/content/Text/66.html
1. 基本概念
为什么要对运算符进行重载 ?
C++ 预定义中的运算符的操作对象 只局限于基本的内置数据类型,但是对于我们自定义的类型(类)是没有办法操作的。但是大多时候我们需要对我们定义的类型进行类似的运算,这个时候就需要我们对运算符进行重新定义,赋予其新的功能,以满足自身的需求。
C++运算符重载的实质:
运算符重载的实质就是 函数重载或函数多态。运算符重载是一种形式的C++多态。目的在于让人能够用同名的函数来完成不同的基本操作。
运算符重载格式:
要重载运算符,需要使用被称为运算符函数的特殊函数形式。
<返回类型说明符> operator <运算符符号> ( <参数表> )
{
<函数体>
}
运算符重载的规则:
- 为了防止用户对标准类型进行运算符重载,C++规定重载后的运算符的操作对象必须至少有一个是用户定义的类型。
也就是说不能对基本数据类型进行重载,这会破坏原有的运算规则。
- 不能创建一个新的运算符,例如不能定义operator** (···)来表示求幂
- 不能修改运算符原先的优先级。
- 使用运算符不能违法运算符原来的句法规则。如不能将% 重载为一个操作数,
例如:
int index;
%index;这种是不被允许的。
- 不能进行重载的运算符:成员运算符,作用域运算符,条件运算符,sizeof运算符,typeid(一个RTTI运算符),const_cast、dynamic_cast、reinterpret_cast、static_cast强制类型转换运算符。
- 大多数运算符可以通过成员函数和非成员函数进行重载但是下面这四种运算符只能通过成员函数进行重载:
= 赋值运算符,
() 数调用运算符,
[ ] 下标运算符,
-> 通过指针访问类成员的运算符。
2. 重载运算符该不该作为成员函数
重载运算符有两种方式,即:
重载为类的成员函数 || 重载为类的非成员函数。
对于成员函数来说,一个操作数通过 this 指针隐式的传递,(即本身),另一个操作数作为函数的参数显示的传递;对于友元函数(非成员函数)两个操作数都是通过参数来传递的。
两者有何区别 ? 先上一段代码:
include <iostream>
using namespace std;
class Test{
public:
Test(int para_x = 0):m_x(para_x){
}; //构造函数
Test operator + (const Test & B) const
{
Test obj;
obj