网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
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;
![img](https://img-blog.csdnimg.cn/img_convert/cb1317cf607ff4ae9f67d34c32f3fadd.png)
![img](https://img-blog.csdnimg.cn/img_convert/406e87db31e5547d626a7563865365e0.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**
识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**