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

operator重载运算符



😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
⏰发布时间⏰:2024-06-21 22:14:42

本文未经允许,不得转发!!!



在这里插入图片描述

正常情况下,C++ 的运算符( +、-、*、/ 等)只能用于对基本类型的常量或变量进行运算,而不能用于类对象之间的运算。

类的对象直接的运算虽然可以通过成员函数或全局函数去实现,如,但这样的写法有时不易理解。

C++的提供了 重载运算符 的特性,允许将一些常见的运算符根据自定义类型的需要去重新定义,尽量让对象之间的运算可以像基本类型的运算一样简单、好理解。

运算符重载的目的是使得 C++ 中的运算符也能够用来操作对象。

下面例子演示了CDate类对象 使用 Add函数与 重载运算符 的运算结果:

 

运行结果如下:
在这里插入图片描述
例子中两个成员函数和的实现是一样的,但三种调用方式中,会比较好理解。

例子中的等价于。在运算符表示法中,运算符左侧的对象(这里为 date)是调用对象,运算符右边的对象(这里为 1) 是作为参数被传递的对象


在这里插入图片描述

重载运算符,本质上也是函数的一种,使用关键字加上作为函数名,运算符函数的格式大致如下:

 

函数名是清楚了,那形参怎样写呢? 返回值类型应该是什么类型?这小节的剩下内容会解决这两个问题。

清楚了重载运算符的大致格式之后,再来了解一下C++对重载运算符的限制:

  • 1、重载后的运算符必须至少有一个操作数是用户定义的类型(类、结构体、枚举),这样可以防止给基本类型重载运算符;
  • 2、使用运算符时不能违反运算符原来的句法规则,例如,不能将加号(+)重载为减法运算。也不能修改运算符优先级;
  • 3、不能创建新运算符,例如,不能定义 operator ( )函数来表示求幂。
  • 4、不能重载下面的运算符:
    • :sizeof 运算符。
    • :成员运算符。
    • :成员指针运算符。
    • :作用域解析运算符。
    • :条件运算符。
    • :—个 RTTI 运算符。
    • :强制类型转换运算符。
    • :强制类型转换运算符。
    • :强制类型转换运算符。
    • :强制类型转换运算符。
  • 5、下面的运算符只能通过成员函数进行重载
    • : 赋值运算符。
    • :函数调用运算符。
    • :下标运算符。
    • :通过指针访问类成员的运算符。

在这里插入图片描述


我们知道重载运算符的函数名是:,那么形参个数和类型应该是什么?

重载运算符函数形参

从上面这段话可以知道,重载运算符函数的形参由运算符的操作数的个数、类型决定的。如果是成员函数,则左边操作对象的类型的形参会省略,以this指针传到运算符函数。以CDate类为例:

 

重载运算符函数返回值类型
重载运算符的返回类型通常情况下应该与其内置版本的返回类型兼容:逻辑运算符和关系运算符应该返冋 bool,算术运算符应该返回一个类类型的值,赋值运算符和复合赋值运算符则应该返冋左侧运算对象的一个引用。

下面代码以重载加号运算符为例,这里是让一个CDate对象加上一个整型:

 

赋值运算符的重载也是C++的一个特别重要的知识点,可以重载为 拷贝赋值运算符 、移动赋值运算符 两种,需要详细了解的可以参考这两篇文章:
【C++ | 拷贝赋值运算符函数】一文了解C++的 拷贝赋值运算符函数
【C++ | 移动赋值运算符】一文了解C++11的 移动赋值运算符

这个小节只介绍怎样声明、定义赋值运算符,拷贝赋值运算符声明、定义如下。赋值运算符只能重载为函数名为,其形参都是一个类型的,返回值是该类型的引用(这样支持连续赋值):

 

在这里插入图片描述

如果一个运算符的左操作数是类对象,则这个运算符一般是可以重载为成员函数的,例如上文的。那如果表达式是,则上面重载的加号运算符匹配不到这个表达式。这是我们就需要将重载运算符写到类外部,而类外定义的函数无法访问类的私有成员,所以又需要将这个类外定义的函数声明为类的友元函数。关于C++的友元,有不了解的,可以参考这篇文章:C++ | 友元(friend)】友元函数、友元类、友元成员函数详解及例子代码。

下面看看怎样将加号运算符重载为友元函数:

  • 1、看要实现怎样的操作。这里是要实现;
  • 2、确定重载运算符的形参,的第一个操作数是int型,第二个操作数是CDate,所以形参可以是:;
  • 3、确定返回值类型,这里我们就直接返回 CDate 类,所以函数原型如下;
     
  • 4、写具体函数实现,我们这里想要的是,让天数加上 i ,完整实现如下:
     
  • 5、将函数声明为类的友元函数,在类声明开头使用friend如下声明:
     

在这里插入图片描述

👉本文主要介绍了为什么需要重载运算符,重载运算符有哪些限制,怎样声明、定义运算符函数,怎样将运算符重载为友元函数。

上面例子的完整代码:

 

在这里插入图片描述
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

版权声明


相关文章:

  • 适配器模式的uml图2025-04-10 16:01:03
  • centos官网2025-04-10 16:01:03
  • 计算机视觉属于人工智能吗2025-04-10 16:01:03
  • centos8哪个版本稳定2025-04-10 16:01:03
  • python抢票软件2025-04-10 16:01:03
  • c语言单片机编程教程2025-04-10 16:01:03
  • 唯爱你一人什么意思2025-04-10 16:01:03
  • python xlrd操作excel大全2025-04-10 16:01:03
  • 同义句转换app2025-04-10 16:01:03
  • 位图索引是什么2025-04-10 16:01:03