实现一个操作符重载的方式通常有两种情况:

  • 将操作符重载实现为类的成员函数。
  • 操作符重载实现为非类的成员函数(即全局函数)。
  1. 将操作符重载实现为类的成员函数

在类体中声明(定义)需要重载的操作符,声明方式跟普通的成员函数一样,只不过操作符重载函数的名字是“关键字operator +以及紧跟其后的一个C++预定义的操作符”。参数则需要传入除自己以外的别的参数(比如==需要两个参数,即自身和另一个对象,因此传入另一个对象即可,自身就是this)。

形式即如下(Student为自定义类):

bool operator==(const Student &student){}

此处要注意输入输出操作(<< and >>)的重载方式有所不同,需要使用友元函数,形式如下:

friend ostream &operator<<(ostream &os, const Student &student)
  1. 操作符重载实现为非类的成员函数

对于全局重载操作符,代表左操作数的参数必须被显式指定。

形式如下:

bool operator>(Student &student, Student &student1)

可以根据以下因素,确定把一个操作符重载为类的成员函数还是全局函数:

  1. 如果一个重载操作符是类成员,那么只有当与它一起使用的左操作数是该类的对象时,该操作符才会被调用;而如果该操作符的左操作数确定为其他的类型,则操作符必须被重载为全局函数;
  2. C++要求'='、'[]'、'()'、'->'操作符必须被定义为类的成员操作符,把这些操作符通过全局函数进行重载时会出现编译错误
  3. 如果有一个操作数是类类型(如string类),那么对于对称操作符(比如==操作符),最好通过全局函数的方式进行重载。

实现操作符重载时,需要注意有如下限制:

  1. 重载后操作符的操作数至少有一个是用户定义类型;
  2. 不能违反原来操作数的语法规则;
  3. 不能创建新的操作符;
  4. 不能重载的操作符包括(以空格分隔):sizeof . .* :: ?: RTTI类型运算符

=、()、[]、以及 ->操作符只能被类的成员函数重载


下面给出示例代码,其中使用全局函数的为重载>。

#include <iostream>using namespace std;class Student {
public:int sno;string name;Student(int s = 0, string n = "") : sno(s), name(n) {}bool operator==(const Student &student) {if (sno == student.sno) return true;return false;}// 将操作符重载实现为类的成员函数bool operator<(const Student &student) {if (sno < student.sno) return true;return false;}// ++student 前缀形式Student &operator++() {sno++;return *this;}// student++ 后缀形式Student operator++(int) {Student student(sno, name);sno++;return student;}friend ostream &operator<<(ostream &os, const Student &student) {os << student.sno << " " << student.name;return os;}friend istream &operator>>(istream &is, Student &student) {cout << "input sno:";is >> student.sno;cout << "input name:";is >> student.name;return is;}
};// 操作符重载实现为非类的成员函数
bool operator>(Student &student, Student &student1) {if (student.sno > student1.sno) return true;return false;
}int main() {Student student_a;cin >> student_a;cout << "your input: " << student_a << endl;Student student_b = student_a++;cout << "student_a: " << student_a << endl;cout << "student_b: " << student_b << endl;cout << "student_a < student_b: " << (student_a < student_b) << endl;cout << "student_a > student_b: " << (student_a > student_b) << endl;cout << "student_a == student_b: " << (student_a == student_b) << endl;cout << endl;Student student_c = ++student_a;cout << "student_a: " << student_a << endl;cout << "student_c: " << student_c << endl;cout << "student_a < student_c: " << (student_a < student_c) << endl;cout << "student_a > student_c: " << (student_a > student_c) << endl;cout << "student_a == student_c: " << (student_a == student_c) << endl;
}

结果如下:

操作符重载!看这篇就够了!相关推荐

  1. Java String,看这篇就够了

    String,是Java中最重要的类.这句肯定的推断不是Java之父詹姆斯·高斯林说的,而是沉默王二说的,因此你不必怀疑它的准确性. 关于字符串,有很多的面试题,但我总觉得理论知识绕来绕去没多大意思. ...

  2. groovy if 判断字符串_Groovy快速入门看这篇就够了

    原标题:Groovy快速入门看这篇就够了 来自:刘望舒(微信号:liuwangshuAndroid) 前言 在前面我们学习了和两篇文章,对Gradle也有了大概的了解,这篇文章我们接着来学习Groov ...

  3. 一下子搞懂JDBC,看这篇就够了--以MySQL为例。

    一下子搞懂JDBC,看这篇就够了–以MySQL为例. 文章目录 一下子搞懂JDBC,看这篇就够了--以MySQL为例. 一.什么是JDBC? 二.JDBC的使用步骤 三.jdbc进阶--上述各个类或接 ...

  4. 一文详解JavaBean 看这篇就够了

    一文详解JavaBean 看这篇就够了 JavaBean的历史渊源 JavaBean的定义(通俗版) JavaBean应用 < jsp:useBean > < jsp:getProp ...

  5. React入门看这篇就够了

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 很多值得了解的细节. 原文:React入门看这篇就够了 作者:Random Fundebug经授权转载,版权归原作者所 ...

  6. uiautomation遍历windows所有窗口_万字长文!滑动窗口看这篇就够了!

    大家好,我是小浩.今天是小浩算法 "365刷题计划" 滑动窗口系列 - 整合篇.之前给大家讲解过一些滑动窗口的题目,但未作系统整理. 所以我就出了这个整合合集,整合工作中除了保留原 ...

  7. .NET Core实战项目之CMS 第五章 入门篇-Dapper的快速入门看这篇就够了

    写在前面 上篇文章我们讲了如在在实际项目开发中使用Git来进行代码的版本控制,当然介绍的都是比较常用的功能.今天我再带着大家一起熟悉下一个ORM框架Dapper,实例代码的演示编写完成后我会通过Git ...

  8. .NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了

    本来这篇只是想简单介绍下ASP.NET Core MVC项目的(毕竟要照顾到很多新手朋友),但是转念一想不如来点猛的(考虑到急性子的朋友),让你通过本文的学习就能快速的入门ASP.NET Core.既 ...

  9. [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了

    园子里关于ASP.NET Core Web API的教程很多,但大多都是使用EF+Mysql或者EF+MSSQL的文章.甚至关于ASP.NET Core Web API中使用Dapper+Mysql组 ...

  10. ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了

    引言 在使用asp.net core 进行api开发完成后,书写api说明文档对于程序员来说想必是件很痛苦的事情吧,但文档又必须写,而且文档的格式如果没有具体要求的话,最终完成的文档则完全取决于开发者 ...

最新文章

  1. python pillow 图片处理
  2. centos7 docker 安装 otter 注意事项
  3. objective-c ——代码块
  4. C语言的补码表示和unsigned及signed的转换
  5. 关于优酷开放SDK之setOnVideoSizeChangedListener
  6. 订单操作-分页查询所有订单
  7. 进程的退出方式以及僵尸进程和孤儿进程
  8. matlab数值计算pdf_Gnuplot科学绘图(九)——栅格以及方程数值解估算
  9. 【实验2】——模糊函数
  10. python大型项目开发规范_大型项目CMakeLIsts.txt的编写规范
  11. inc si指令的作用_【Vue】Re04 指令:第二部分 - emdzz
  12. Tensorflow训练神经网络
  13. win7允许远程桌面连接这台计算机,教你怎样win7远程桌面连接设置
  14. 7款ui设计开发初学者必学的设计软件
  15. stm32f407的串口调试助手乱码
  16. data backup vs archiving
  17. 从制造大国到制造强国,智能制造改变制造业未来
  18. Spring总结(IOC、AOP原理以及Spring事务)
  19. 青岛智慧城市建设以人为本 勾勒未来图景
  20. Oracle 给某列前后添加后缀或者前缀

热门文章

  1. 【公告】关于“天天秒杀”活动时间调整
  2. C语言程序——函数(1)
  3. [YOLO专题-3]:总体-目标检测的常见模型评估指标
  4. Mycraft红石蹦床
  5. 贵州自主游(上)——吃在贵阳
  6. web前端分享HTML5中的nav标签学习笔记
  7. WebRTC服务器的配置
  8. Yii2之路——安装配置
  9. 第十六章 ConvNeXt网络详解
  10. 二、HBase的核心数据结构 跳跃表、LSM树、布隆过滤器