C++运算符重载

C++我们自定义的类型(类)是没有办法操作的。这个时候就需要我们对这么运算符进行重新定义,赋予其新的功能,以满足自身的需求。运算符重载的实质就是函数重载或函数多态。

要重载运算符,需要使用被称为运算符函数的特殊函数形式,运算符函数形式:operatorp(argument-list)//operator 后面的'p'为要重载的运算符符号。

例子:

  1. MyTime.h文件:  
  2. #pragma once  
  3. #ifndef MYTIME_H_  
  4. #define MYTIME_H_  
  5. class CMyTime  
  6. {  
  7. private:  
  8. int m_hours;  
  9. int m_minutes;  
  10. public:  
  11. CMyTime();  
  12. CMyTime(int h, int m = 0);  
  13. void AddHr(int h);  //小时更改  
  14. void AddMin(int m);//分钟更改  
  15. void Reset(int h = 0, int m = 0);  //重新设置时间  
  16. CMyTime operator+(const CMyTime &t) const;  //重载加法  
  17. CMyTime operator-(const CMyTime &t) const;  //重载减法  
  18. CMyTime operator*(double n) const;                //重载乘法  
  19. void Show() const;  
  20. ~CMyTime();  
  21. };  
  22. #endif  


[cpp]  view plain  copy
  1. MyTIme.cpp文件:  
  2. #include "stdafx.h"  
  3. #include "MyTime.h"  
  4. #include <iostream>  
  5.   
  6. CMyTime::CMyTime()  
  7. {  
  8. m_hours = 0;  
  9. m_minutes = 0;  
  10. }  
  11.   
  12.   
  13. CMyTime::CMyTime(int h, int m)  
  14. {  
  15. m_hours = h;  
  16. m_minutes = m;  
  17. }  
  18.   
  19.   
  20. CMyTime::~CMyTime()  
  21. {  
  22. }  
  23.   
  24.   
  25. void CMyTime::AddHr(int h)                                             //小时更改  
  26. {  
  27. m_hours += h;  
  28. }  
  29.   
  30.   
  31. void CMyTime::AddMin(int m)                                             //分钟更改  
  32. {  
  33. m_minutes = m;  
  34. }  
  35.   
  36.   
  37. void CMyTime::Reset(int h, int m)                                           //重新设置时间  
  38. {  
  39. m_hours = h;  
  40. m_minutes = m;  
  41. }  
  42.   
  43.   
  44. CMyTime CMyTime::operator+(const CMyTime &t) const              //重载加法运算符函数  
  45. {  
  46. CMyTime sum;  
  47. sum.m_minutes = t.m_minutes + m_minutes;  
  48. sum.m_hours = t.m_hours + m_hours + sum.m_minutes / 60;  
  49. sum.m_minutes %= 60;  
  50. return sum;  
  51. }  
  52.   
  53.   
  54. CMyTime CMyTime::operator-(const CMyTime &t) const         //重载为减法运算符函数  
  55. {  
  56. CMyTime diff;  
  57. int tot1, tot2;  
  58. tot1 = t.m_minutes + 60 * t.m_hours;  
  59. tot2 = m_minutes + 60 * m_minutes;  
  60. diff.m_minutes = (tot2 - tot1) % 60;  
  61. diff.m_hours = (tot2 - tot1) / 60;  
  62. return diff;  
  63. }  
  64.   
  65.   
  66. CMyTime CMyTime::operator*(double n) const                 //重载为乘法运算符函数。  
  67. {  
  68. CMyTime result;  
  69. long totalMinutes = m_hours * 60 * n+ m_minutes *n;  
  70. result.m_minutes = totalMinutes % 60;  
  71. result.m_hours = totalMinutes / 60;  
  72. return result;  
  73. }  
  74.   
  75.   
  76. void CMyTime::Show() const  
  77. {  
  78. std::cout << m_hours << " hours "  
  79. << m_minutes << " minutes\n";  
  80. }  


[cpp]  view plain  copy
  1. 主函数:  
  2.   
  3. // Study11-02.cpp : 定义控制台应用程序的入口点。  
  4. //  
  5.   
  6.   
  7. #include "stdafx.h"  
  8. #include <iostream>  
  9. #include "MyTime.h"  
  10.   
  11.   
  12. int _tmain(int argc, _TCHAR* argv[])  
  13. {  
  14. using std::cout;  
  15. using std::endl;  
  16. CMyTime weeding(4, 35);  
  17. CMyTime waxing(2, 47);  
  18. CMyTime total;  
  19. CMyTime diff;  
  20. CMyTime adjusted;  
  21.   
  22.   
  23. cout << "weeding Time = ";  
  24. weeding.Show();  
  25. cout << endl;  
  26.   
  27.   
  28. cout << "waxing Time = ";  
  29. waxing.Show();  
  30. cout << endl;  
  31.   
  32.   
  33. cout << "total work Time = ";   //(1)  
  34. total = weeding + waxing;  
  35. total.Show();  
  36. cout << endl;  
  37.   
  38.   
  39. diff = weeding - waxing;  
  40. cout << "weeding Time - waxing Time = "//(2)  
  41. diff.Show();  
  42. cout << endl;  
  43.   
  44.   
  45. adjusted = total *1.5;                     //(3)  
  46. cout << "adjusted work Time = ";  
  47. adjusted.Show();  
  48. cout << endl;  
  49.   
  50.   
  51. return 0;  
  52. }  
<think>好的,我现在要帮用户介绍C++运算符重载。首先,我需要回忆一下运算符重载的基本概念。运算符重载允许用户自定义类型使用C++内置的运算符,比如+、-、*等,使得代码更直观和易读。例如,可以让两个对象直接相加,而不必调用特定的函数。 接下来,我应该考虑用户可能的背景。用户可能是刚开始学习C++,或者已经有一定基础但想深入了解运算符重载。因此,解释需要清晰,从基础开始,逐步深入。可能需要先说明什么是运算符重载,为什么需要它,然后讲解如何实现,包括语法和注意事项。 然后,运算符重载的语法是关键部分。需要详细说明如何定义运算符重载函数,包括成员函数和非成员函数(友元函数)的区别。例如,重载+运算符时,成员函数通常只需要一个参数,因为左操作数是对象本身,而非成员函数需要两个参数。同时,要提到一些运算符必须作为成员函数重载,比如赋值运算符=。 例子是帮助理解的重要部分。我应该举一个简单的例子,比如为自定义的Vector类重载+运算符,这样用户可以看到具体的实现方式。同时,需要区分成员函数和非成员函数的例子,说明它们的不同应用场景。 注意事项和常见问题也不能遗漏。比如不能重载运算符(如.、::、sizeof等),以及重载时保持运算符的原有语义,避免滥用导致代码难以理解。此外,还需要提到运算符的返回类型和参数类型的选择,比如是否返回引用或值,参数的const修饰等。 用户可能还会有疑问,比如运算符重载的使用场景,或者何时应该使用成员函数而非友元函数。因此,在解释过程中需要涵盖这些方面,可能的话,给出一些最佳实践的建议。 最后,总结运算符重载的优点和需要注意的地方,帮助用户全面理解。确保语言通俗易懂,避免过于专业的术语,必要时进行类比,让用户更容易接受。</think>### C++运算符重载详解 #### 1. 什么是运算符重载运算符重载(Operator Overloading)是C++中的一种特性,允许开发者**为自定义类型(如类或结构体)重新定义运算符的行为**。通过重载运算符,可以让对象像内置类型(如`int`、`double`)一样使用`+`、`-`、`*`、`==`等运算符,提升代码可读性和简洁性。 --- #### 2. 如何实现运算符重载运算符重载通过**成员函数****全局函数**实现,语法形式为: $$ \text{返回类型 operator 运算符(参数列表)} $$ ##### 示例1:成员函数重载`+` ```cpp class Vector { public: int x, y; // 成员函数重载 + Vector operator+(const Vector& other) { return {x + other.x, y + other.y}; } }; // 使用 Vector v1{1, 2}, v2{3, 4}; Vector v3 = v1 + v2; // 等价于 v1.operator+(v2) ``` ##### 示例2:全局函数重载`<<`(输出流) ```cpp class Student { public: string name; int age; }; // 全局函数重载 << ostream& operator<<(ostream& os, const Student& s) { os << "Name: " << s.name << ", Age: " << s.age; return os; } // 使用 Student s{"Alice", 20}; cout << s; // 输出: Name: Alice, Age: 20 ``` --- #### 3. 常见运算符重载规则 | 运算符类型 | 可重载性 | 示例 | |------------------|----------------|----------------------| | 算术运算符 | `+`, `-`, `*` | `a + b` | | 关系运算符 | `==`, `>`, `<` | `a == b` | | 赋值运算符 | `=`, `+=` | `a = b` | | 下标运算符 | `[]` | `a[0]` | | 函数调用运算符 | `()` | `a(1, 2)` | | **不可重载运算符** | `.`、`::`、`?:`、`sizeof` | 无法重载 | --- #### 4. 关键注意事项 1. **参数限制**: - 至少一个操作数是用户自定义类型(不能全为内置类型)。 - 不能修改运算符的优先级或结合性。 2. **成员函数 vs 全局函数**: - 赋值运算符(`=`)、下标运算符(`[]`)、函数调用运算符(`()`)**必须**作为成员函数重载。 - 输入输出运算符(`>>`、`<<`)通常作为全局函数。 3. **保持语义一致性**: - 例如重载`+`时,不应修改操作数本身,而应返回新对象。 --- #### 5. 完整示例:复数类重载 ```cpp class Complex { private: double real, imag; public: Complex(double r = 0, double i = 0) : real(r), imag(i) {} // 成员函数重载 + Complex operator+(const Complex& other) { return Complex(real + other.real, imag + other.imag); } // 全局友元函数重载 << friend ostream& operator<<(ostream& os, const Complex& c); }; ostream& operator<<(ostream& os, const Complex& c) { os << c.real << " + " << c.imag << "i"; return os; } // 使用 Complex c1(2, 3), c2(4, 5); Complex c3 = c1 + c2; cout << c3; // 输出: 6 + 8i ``` --- #### 6. 应用场景 - 数学计算(向量、矩阵、复数) - 字符串操作(`str1 + str2`) - 容器类(自定义数组、链表) --- #### 7. 总结 **优点**:提升代码直观性,使自定义类型操作更自然。 **注意**:避免过度使用或违反直觉的重载(例如用`+`实现减法)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值