本文主要介绍在 C++ 编程语言中使用关键字 operator 重载运算符(也称“重载操作符”)的相关知识,同时通过示例代码介绍使用关键字 operator 重载运算符的具体方法。

1 概述

1.1 What

operator 是 C++ 的一个关键字,它和运算符(如 =)一起使用,表示一个运算符重载函数,在理解时可将 operator 和待重载的运算符整体(如 operator=)视为一个函数名。

使用 operator 重载运算符,是 C++ 扩展运算符功能的方法。使用 operator 扩展运算符功能的原因如下:

  • 使重载后的运算符的使用方法与重载前一致;
  • 扩展运算符的功能只能通过函数的方式实现。(实际上,C++ 中各种“功能”都是通过函数实现的)

1.2 Why

C++ 提供的运算符,通常只支持对于基本数据类型和标准库中提供的类进行操作,而对于用户自己定义的类,如果想要通过这些运算符实现一些基本操作(如比较大小、判断是否相等),就需要用户自己来定义这个运算符的具体实现了。

例如,我们设计了一个名为“person”的类,现在要判断 person 类的两个对象 p1 和 p2 是否一样相等,比较规则是比较对象的年龄(person 类的数据成员“age”)大小。那么,在设计 person 类的时候,就可以通过针对运算符“==”进行重载,来使运算符“==”具有比较对象 p1 和 p2 的能力(实际上比较的内容是 person 类中的数据成员“age”)。

上面描述的对运算符“==”进行重载,之所以叫“重载”,是由于编译器在实现运算符“==”功能的时候,已经针对这个运算符提供了对于一些基本数据类型的操作支持,只不过现在该运算符所操作的内容变成了我们自定义的数据类型(如 class),而在默认情况下,该运算符是不能对我们自定义的数据类型进行操作的。因此,就需要我们通过对该运算符进行重载,给出该运算符操作我们自定义的数据类型的方法,从而达到使用该运算符对我们自定义的数据类型进行运算的目的。

1.3 How

实现运算符重载的方式通常有以下两种:

  • 运算符重载实现为类的成员函数;
  • 运算符重载实现为非类的成员函数(即全局函数)。

1.3.1 运算符重载实现为类的成员函数

在类体中声明(定义)需要重载的运算符,声明方式跟普通的成员函数一样,只不过运算符重载函数的名字是“operator紧跟一个 C++ 预定义的操作符”,示例用法如下(person 是我们定义的类):

    bool operator==(const person& ps){if (this->age == ps.age){return true;}return false;}

示例代码内容如下:

#include <iostream>using namespace std;class person
{
private:int age;
public:person(int nAge){this->age = nAge;}bool operator==(const person& ps){if (this->age == ps.age){return true;}return false;}
};int main()
{person p1(10);person p2(10);if (p1 == p2){cout << "p1 is equal with p2." << endl;}else{cout << "p1 is not equal with p2." << endl;}return 0;
}

编译并运行上述代码,结果如下:

通过上述结果能够知道:因为运算符重载函数“operator==”是 person 类的一个成员函数,所以对象 p1、p2 都可以调用该函数。其中的 if (p1 == p2) 语句,相当于对象 p1 调用函数“operator==”,把对象 p2 作为一个参数传递给该函数,从而实现了两个对象的比较。

1.3.2 运算符重载实现为非类的成员函数(即全局函数)

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

示例代码如下:

#include <iostream>using namespace std;class person
{
public:int age;
};// 左操作数的类型必须被显式指定
// 此处指定的类型为person类
bool operator==(person const& p1 ,person const& p2)
{if (p1.age == p2.age){return true;}else{return false;}
}int main()
{person p1;person p2;p1.age = 18;p2.age = 18;if (p1 == p2){cout << "p1 is equal with p2." << endl;}else{cout << "p1 is NOT equal with p2." << endl;}return 0;
}

编译并运行上述代码,结果如下:

1.3.4 运算符重载的方式选择

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

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

1.3.5 运算符重载的限制

实现运算符重载时,需要注意以下几点:

  • 重载后运算符的操作数至少有一个是用户定义的类型;
  • 不能违反运算符原来的语法规则;
  • 不能创建新的运算符;
  • 有一些运算符是不能重载的,如“sizeof”;
  • =、()、[]、-> 操作符只能被类的成员函数重载。

1.3.6 运算符重载的详细用法

  • 赋值运算符的重载函数(operator=),请点击此处

C++编程语言中重载运算符(operator)介绍相关推荐

  1. 重载运算符operator

    运算符重载注意点: 1.算术和关系操作符返回的是一个左值或右值,而不是一个引用 2.赋值操作符一定要定义为成员函数如"=" 3.一般而言,赋值操作符和复合赋值操作符应返回左操作数的 ...

  2. C++ 重载运算符 operator

    operator  是什么 operator 是C++的一个关键字,它和运算符(+,-,*,/,=,等等)一起使用,表示一个运算符重载函数 operator 没有返回语句 operator 的作用 : ...

  3. OpenCV中Mat类的重载运算符operator()的用法

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 定义如下: inline Mat Mat::op ...

  4. C# 重载 Equals() 方法、重载运算符、声明显隐式转换的简要整理

    自动生成 可以使用 JetBrains ReSharper 的代码生成功能来自动生成各种结构性的或可重载的成员,而不必自行手写,因为非常麻烦且易错. 如确需手写,可参考本文. 引用类型和值类型 本文不 ...

  5. c++重载++运算符_C ++运算符重载| 查找输出程序| 套装3

    c++重载++运算符 Program 1: 程序1: #include <iostream> using namespace std; class Test { public: int A ...

  6. halcon中编程运算符_R编程中的运算符

    halcon中编程运算符 Operators in a programming language are certain tokens or symbols that perform specific ...

  7. vs2003 局部友元访问私有不可访问_C++ 类:重载运算符与友元

    18.类中重载运算符与友元 上次节中学习了如何在类中重新定义赋值(=)运算符,实际上在一个自定义类中除了赋值(=)运算符外,类的对象是不可以直接使用运算符的,比如你在main函数中写这样的代码会报错: ...

  8. 栈内存 ,堆内存区别 C++ 动态内存 == 与equal区别 复合函数奇偶性 三角函数转换公式: 虚函数和纯虚函数: C++ 中的运算符重载 数据封装,数据抽象 C++ 接口(抽象类

    目录 栈内存 ,堆内存区别 C++ 动态内存 == 与equal区别 复合函数奇偶性 三角函数转换公式: 虚函数和纯虚函数: C++ 中的运算符重载 数据封装,数据抽象 C++ 接口(抽象类): #和 ...

  9. java怎么重载运算符_运算符在Java中重载

    不,Java不支持用户定义的运算符重载. 接近"自定义"运算符重载的Java的唯一方面就是处理string的+,这或者导致了常量的编译时间连接,或者使用StringBuilder ...

  10. 中双目运算符_C++日志(四十)教你如何以非成员函数的形式重载运算符

    上一篇日志中讲述了如何通过类的非静态函数成员,进行运算符重载: 机器学习入坑者:C++日志(三十九)教你如何以类的非静态成员函数形式重载运算符​zhuanlan.zhihu.com 在C++中,同样可 ...

最新文章

  1. 【转载】C#编码标准━━项目设置和项目结构
  2. python批量读取文件夹的图片并处理成模型输入格式
  3. java调用WCF问题
  4. This generally means that another instance of this process was already runni
  5. 查询DB中每个表占用的空间大小
  6. 计算机丢失用户名,问下经验人士电脑用户名丢失怎么办
  7. JAVA实现成语大全-成语接龙,给小孩的应用
  8. windows批处理bat常用指令
  9. kali linux基本命令
  10. Flutter 实现一款简单的音乐播放器
  11. 计算机三级嵌入式系统知识点考查(易错)
  12. Js学习之拖拉事件(drag)
  13. 基于 Agora SDK 实现 Windows 端的多人视频互动(基于3.6.2版本)
  14. 《多一点爱心》 --《年轻的潮》 汪国真
  15. 网易Airtest简介
  16. 打靶法c语言程序,打靶法求解一维Schrodinger方程程序示例
  17. 计算机技术在口腔医学中的应用研究,计算机技术在口腔医学的运用.docx
  18. LINUX基础 第四次课 10月15日
  19. Android 代码混淆 包名被混淆 主工程二次混淆 一站解决你的混淆
  20. matlab吃cpu还是显卡_在GPU上运行MATLAB程序

热门文章

  1. 源码看JAVA【十】Short
  2. 开博尔智能android播放器,高端安卓播放器的选择——开博尔Q10Plus 二代 4K高清播放器...
  3. 9 个 yyds Java项目,可应对各种私活!
  4. WireShark基本使用(5)第 5 章 文件输入/输出及打印
  5. 网络工程师下午考试试题专题专解
  6. 5G,仅仅是更快的网速吗?
  7. 启发函数 (Heuristic Function) —Octile
  8. 计算机老师一句话,写给老师的一句话短句 感谢老师的简单一句话
  9. 面对危机,中国也不应修修补补
  10. 设置 Google Analytics(分析)全局网站统计代码