并非所有运算符都能重载

可以重载的运算符

重载运算符 - 图1

不能重载的运算符

重载运算符 - 图2
不能改变 C++内部数据类型(如 int,float 等)的运算符

格式

函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。

  1. Box operator+(const Box&);

对象作为参数进行传递

  1. // 编写一个复数类模板Complex,其数据成员real和image的类型未知,定义相应
  2. // 的成员函数,包括构造函数、返回实部的函数、返回虚部的函数、重载加法运
  3. // 算符、重载减法运算符以及重载输出运算符。
  4. // 温馨小帖示:参考“相关知识”中的“示例程序”。
  5. #include <iostream> // 编译预处理命令
  6. using namespace std; // 使用命名空间std
  7. // 声明复数类模板
  8. template <class T>
  9. class Complex
  10. {
  11. private:
  12. T real; // 实部
  13. T image; // 虚部
  14. public:
  15. // 公有函数
  16. Complex(T r = 0, T i = 0): real(r), image(i){ }// 构造函数
  17. T GetReal() const { return real; } // 返回实部
  18. T GetImage() const { return image; } // 返回虚部
  19. Complex<T> operator-(const Complex<T> &z2);
  20. Complex<T> operator+(const Complex<T> &z2);
  21. };
  22. // 输出运算符重载函数(非成员函数)
  23. template <class T>
  24. ostream &operator<<(ostream &out, const Complex<T> &z)// 重载运算符<<
  25. {
  26. // 温馨小贴士:
  27. // (1)本运算符重载函数要求输出运算符“<<”,输出格式为“实部+虚部i”,例如:2+3i, 2-3i, -2+3i, 8, -8, 8i, -5i, 0
  28. // (2)在输出完复数后不用加换行符
  29. // (3)z的实部应写为“z.GetReal()”,z的虚部应写为“z.GetImage()”
  30. // (4)在本函数体代码中,输出流对象不应cout,而应是形参out,例如“cout << 0;”应改为“out << 0;”
  31. if (z.GetReal() != 0)
  32. {
  33. if (z.GetImage() < 0) out << z.GetReal() << z.GetImage() << "i";//虚部为负,例如2-5i
  34. else if (z.GetImage() == 0) out << z.GetReal(); // 虚部为0,例如3
  35. else out << z.GetReal() << "+" << z.GetImage() << "i"; // 虚部为正,例如2+5i
  36. }
  37. else
  38. {
  39. if (z.GetImage() == 0) out << 0; // 虚部为0,例如0
  40. else out << z.GetImage() << "i"; // 虚部非0, 例如5i, -8i
  41. }
  42. return out; // 返回输出流对象
  43. }
  44. // 加法运算符重载函数(成员函数)
  45. template <class T>
  46. Complex<T> Complex<T>::operator+(const Complex<T> &z2)
  47. {
  48. return Complex(this->real+z2.GetReal(),this->image+z2.GetImage());
  49. // 减法运算符重载函数
  50. template <class T>
  51. Complex<T> Complex<T>::operator-(const Complex<T> &z2)
  52. {
  53. return Complex(this->real-z2.GetReal(),this->image-z2.GetImage());
  54. }