当前位置:网站首页 > 技术博客 > 正文

运算符=重载



重载运算符是通过对运算符的重新定义,使得其支持特定数据类型的运算操作。重载运算符是重载函数的特殊情况。

当一个运算符出现在一个表达式中,并且运算符的至少一个操作数具有一个类或枚举的类型时,则使用重载决议(overload resolution)确定应该调用哪个满足相应声明的用户定义函数。

通俗的讲,如果把使用「运算符」看作一个调用特殊的函数(如将 视作调用 ),并且这个函数的参数(操作数)至少有一个是 、 或 的类型,编译器就需要根据操作数的类型决定应当调用哪个自定义函数。

在 C++ 中,我们可以重载几乎所有可用的运算符。

重载运算符存在如下限制:

  • 只能对现有的运算符进行重载,不能自行定义新的运算符。
  • 以下运算符不能被重载:(作用域解析),(成员访问),(通过成员指针的成员访问),(三目运算符)。
  • 重载后的运算符,其运算优先级,运算操作数,结合方向不得改变。
  • 对 (逻辑与)和 (逻辑或)的重载失去短路求值。

重载运算符分为两种情况,重载为成员函数或非成员函数。

当重载为成员函数时,因为隐含一个指向当前成员的 指针作为参数,此时函数的参数个数与运算操作数相比少一个。

而当重载为非成员函数时,函数的参数个数与运算操作数相同。

其基本格式为(假设需要被重载的运算符为 ):

下面将给出几个重载运算符的示例。

下面定义了一个二维向量结构体 并实现了相应的加法和内积的重载。

自增自减运算符分为两类,前置()和后置()。为了区分前后置运算符,重载后置运算时需要添加一个类型为 的空置形参。

可以将前置自增理解为调用 或 ,后置自增理解为调用 或 。

另外一点是,内置的自增自减运算符中,前置的运算符返回的是引用,而后置的运算符返回的是值。虽然重载后的运算符不必遵循这一限制,不过在语义上,仍然期望重载的运算符与内置的运算符在返回值的类型上保持一致。

对于类型 T,典型的重载自增运算符的定义如下:

重载定义(以 为例)成员函数非成员函数前置后置

函数调用运算符 只能重载为成员函数。通过对一个类重载 运算符,可以使该类的对象能像函数一样调用。

重载 运算符的一个常见应用是,将重载了 运算符的结构体作为自定义比较函数传入优先队列等 STL 容器中。

下面就是一个例子:给出 个学生的姓名和分数,按分数降序排序,分数相同者按姓名字典序升序排序,输出排名最靠前的人的姓名和分数。

下面定义了一个比较结构体,实现自定义优先队列的排序方式。

在 和一些 STL 容器中,需要用到 运算符。在使用自定义类型时,我们需要手动重载。

下面是一个例子,实现了和上一节相同的功能

上面的代码将小于号重载为了成员函数,当然重载为非成员函数也是可以的。

事实上,只要有了 运算符,则其他五个比较运算符的重载也可以很容易实现。

参考资料与注释:


版权声明


相关文章:

  • 什么是序列化与反序列化2024-11-22 21:30:05
  • uboot文件结构2024-11-22 21:30:05
  • dos文件转换成pdf2024-11-22 21:30:05
  • 跳表数据结构与算法2024-11-22 21:30:05
  • 重载乘法运算符的函数原型声明2024-11-22 21:30:05
  • tftp工具下载2024-11-22 21:30:05
  • formdataparam2024-11-22 21:30:05
  • 内置声卡精调2024-11-22 21:30:05
  • 二叉排序树构造方法2024-11-22 21:30:05
  • 创建用户并指定uid2024-11-22 21:30:05