C++中的重载运算符

简介: 🐰 运算符的重载🌸实现对象之间的运算🌸重载运算符的规则

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

目录

🐰 运算符的重载

🌸实现对象之间的运算

🌸重载运算符的规则


🐰 运算符的重载

运算符的重载

我们之前学过函数的重载,其实运算符也可以重载。运算符的重载是对已有的运算符重新定义,赋予其另一种功能,以适应不同的数据类型。实际上,我们使用过运算符的重载。例如,我们都已习惯于用加法运算符"+"对整数、单精度数和双精度数进行加法运算,

例如:

1. #include<iostream>
2. using namespace std;
3. int main()
4. {
5. int a=2,b=3,c;
6.     c=a+b;
7.     cout<<"c="<<c<<endl;
8. float x=3.5,y=6.5,z,t;
9.     z=x+y;
10.     cout<<"z="<<z<<endl;
11.     t=z+c;
12.     cout<<"t="<<t<<endl;
13. return 0;
14. }
15. 结果为:
16. c=5
17. z=10
18. t=15

为什么同一个运算符"+"可以用于完成不同类型的数据的加法呢?这是因为C++已经对运算符"+"进行了重载,所以加法运算符"+"就适用于整数、单精度数和双精度数数据的加法。在上面程序中,表达式"x+y"对两个单精度数进行加法运算,编译器会“调用”执行单精度数加法的"+"运算符重载函数。而表达式“c+z”对一个整数和一个单精度数进行加法运算,编译器首先“调用”特殊的函数,把整数转化为单精度数,然后“调用”执行单精度数加法"+"运算符重载函数。

🌸实现对象之间的运算

1. #include<iostream>
2. using namespace std;
3. class A
4. {
5. public:
6. A(int a1=0,int b1=0):a(a1),b(b1)
7.     {
8.         ;
9.     }
10. A add(A &ptr)
11.     {
12. return A(a+ptr.a,b+ptr.b);//(1)
13. //A c;//(2)
14. //c.a=a+ptr.a;
15. //c.b=b+ptr.b;
16. //return c;
17. //这两种写法都可以。
18.     }
19. void show()
20.     {
21.         cout<<"("<<a<<","<<b<<")"<<endl;
22.     }
23. private:
24. int a;
25. int b;
26. };
27. int main()
28. {
29. A a(1,2),b(3,4),c;
30.     c=a.add(b);
31.     c.show();
32. return 0;
33. 
34. }
35. 结果:
36. (4,6)

使用成员函数来实现对象a和b的加法运算,如果我们希望能够实现"c=a+b",这就需要用重载运算符"+"来解决

运算符的重载实质上是函数的重载。运算符重载的方法是定义一个重载运算的函数,在实现过程中,编译系统会自动把指定的运算表达式转化为对运算符函数的调用。

重载运算符函数的格式:

1. 函数返回类型 operator 运算符名称(形参列表)
2. {
3.     对运算符的重载处理
4. }

函数名由operater和运算符组成,如“operator +”就是对运算符“+”重载。

例如:

1. #include<iostream>
2. using namespace std;
3. class A
4. {
5. public:
6. A(int a1=0,int b1=0):a(a1),b(b1)
7.     {
8.         ;
9.     }
10.     A operator+ (A &ptr)
11.     {
12. return A(a+ptr.a,b+ptr.b);
13.     }
14. void show()
15.     {
16.         cout<<"("<<a<<","<<b<<")"<<endl;
17.     }
18. private:
19. int a;
20. int b;
21. };
22. int main()
23. {
24. A a(1,2),b(3,4),c;
25.     c=a+b;//这样我们就对“+”进行重载,更加直接看出c=a+b
26.     c.show();
27. //其实我们还可以像原来一样调用函数,因为函数名由operater和运算符组成,所以等价于c=a+b,但是前者更加直观和方便
28.     c=a.operator+(b);
29.     c.show();
30. return 0;
31. 
32. }
33. 结果:
34. (4,6)
35. (4,6)

🌸重载运算符的规则

(1)C++不允许自己定义新的运算符,只能对C++中已有的运算符进行重载。

(2)运算符重载针对新型数据的实际需要,对原有的运算符进行适当的改造。

(3)C++允许重载的运算符包括C++几乎所有的运算符。

2AC02FF1-0855-4A37-8404-069ADB87147E.jpeg

 

在C++中有以下5个运算符不允许被重载:

8E2973D8-F8F3-4A1F-B454-DF737C90435C.jpeg

 

(4)坚持4个“不能改变”。即不能改变运算符操作数的个数;不能改变运算符原有的优先级;不能改变运算符原有的结合性;不能改变运算符原有的语法结构

 单目远算符重载之后只能是单目运算符,双目远算符重载之后仍然是是双目运算符。

 C++语言已经预先规定了每个运算符的优先级,已决定运算次序,不能怎样进行重载,各运算符之间的优先级不会改变。

 C++语言已经预先规定了每个运算符结合性,例如,赋值运算符"="是自右向左的,重载之后仍为自右向左。

(5)重载的运算符必须和自己定义的自定义类型对象一起使用,其参数至少应该有一个是类对象(类对对象的引用)。也就是说参数不能全部是C++的标准类型,以防止自己修改用于标准数据的运算符的性质。

(6)重载运算符的函数不能有带默认值的参数,否则就改变了运算符参数的个数。

(7)用于类对象的运算符一般必须重载,但有两个例外,运算符"="和"&"可以不必自己重载

赋值运算符"="可以用于每个类对象,可以利用它在同类对象之间的相互赋值。因为系统为每个新申明的类重载了一个赋值运算符,它的作用是逐个复制类对象的数据成员。但如果,类数据成员有动态分配的指针成员,就需要自己重载赋值运算符,否则会导致指针悬挂问题。

🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸  

相关文章
|
16天前
|
C++
C++(十九)new/delete 重载
本文介绍了C++中`operator new/delete`重载的使用方法,并通过示例代码展示了如何自定义内存分配与释放的行为。重载`new`和`delete`可以实现内存的精细控制,而`new[]`和`delete[]`则用于处理数组的内存管理。不当使用可能导致内存泄漏或错误释放。
|
1月前
|
C++
c++学习笔记02 运算符
C++学习笔记,介绍了C++中的运算符,包括基本的加减乘除、求模、前后置递增递减、赋值运算符、比较运算符和逻辑运算符的使用及其注意事项。
32 6
|
2月前
|
NoSQL 编译器 Redis
c++开发redis module问题之如果Redis加载了多个C++编写的模块,并且它们都重载了operator new,会有什么影响
c++开发redis module问题之如果Redis加载了多个C++编写的模块,并且它们都重载了operator new,会有什么影响
|
2月前
|
存储 C++
【C++】string类的使用③(非成员函数重载Non-member function overloads)
这篇文章探讨了C++中`std::string`的`replace`和`swap`函数以及非成员函数重载。`replace`提供了多种方式替换字符串中的部分内容,包括使用字符串、子串、字符、字符数组和填充字符。`swap`函数用于交换两个`string`对象的内容,成员函数版本效率更高。非成员函数重载包括`operator+`实现字符串连接,关系运算符(如`==`, `&lt;`等)用于比较字符串,以及`swap`非成员函数。此外,还介绍了`getline`函数,用于按指定分隔符从输入流中读取字符串。文章强调了非成员函数在特定情况下的作用,并给出了多个示例代码。
|
2月前
|
NoSQL Redis C++
c++开发redis module问题之避免多个C++模块之间因重载operator new而产生的冲突,如何解决
c++开发redis module问题之避免多个C++模块之间因重载operator new而产生的冲突,如何解决
|
3月前
|
C++
C++之运算符
C++之运算符
|
3月前
|
安全 程序员 C++
C++一分钟之-重载运算符
【6月更文挑战第21天】C++的运算符重载让程序员能为自定义类型定制运算符行为,增强代码表达力。但要注意清晰性、优先级和返回类型。遵循运算符原有意义,充分测试,并用注释解释非直观设计。示例展示了如何为复数类重载`+`运算符。避免重载内置类型,注意结合性,且慎用隐式转换。重载应提升可读性而非复杂化代码。
36 2
|
3月前
|
C++
C++一分钟之-理解C++的运算符与表达式
【6月更文挑战第18C++的运算符和表达式构成了编程的基础,涉及数学计算、逻辑判断、对象操作和内存管理。算术、关系、逻辑、位、赋值运算符各有用途,如`+`、`-`做加减,`==`、`!=`做比较。理解运算符优先级和结合律至关重要。常见错误包括优先级混淆、整数除法截断、逻辑运算符误用和位运算误解。解决策略包括明确优先级、确保浮点数除法、正确使用逻辑运算符和谨慎进行位运算。通过实例代码学习,如 `(a &gt; b) ? &quot;greater&quot; : &quot;not greater&quot;`,能够帮助更好地理解和应用这些概念。掌握这些基础知识是编写高效、清晰C++代码的关键。
30 3
|
3月前
|
C++
C++函数的默认参数、占位符、重载
C++函数的默认参数、占位符、重载