原文: https://www.programiz.com/cpp-programming/operator-overloading

在 C++ 中,可以更改运算符的工作方式(对于用户定义的类型)。 在本文中,您将学习实现运算符重载功能。

对于基本类型的变量,例如intfloatdouble等,运算符的含义始终相同。例如:要相加两个整数,将使用+运算符。

但是,对于用户定义的类型(例如:对象),您可以重新定义运算符的工作方式。 例如:

一个类的两个对象是否包含字符串作为其数据成员。 您可以重新定义+运算符的含义,并使用它来连接那些字符串。

C++ 编程中的此功能允许程序员重新定义运算符的含义(当它们对类对象进行运算时),这称为运算符重载。


为什么要使用运算符重载?

您可以编写任何 C++ 程序,而无需知道运算符重载。 但是,程序员大量使用运算符操作来使程序直观。 例如,

您可以将代码替换为:

  1. calculation = add(multiply(a, b),divide(a, b));

  1. calculation = (a*b)+(a/b);

如何在 C++ 编程中重载运算符?

为了重载运算符,在类内部将特殊的运算符函数定义为:

  1. class className
  2. {
  3. ... .. ...
  4. public
  5. returnType operator symbol (arguments)
  6. {
  7. ... .. ...
  8. }
  9. ... .. ...
  10. };
  • 在这里,returnType是函数的返回类型。
  • 函数的 returnType后跟运算符关键字。
  • Symbol是要重载的运算符。 像:+, <, -, ++
  • 您可以通过类似于函数的方式将参数传递给运算符。

示例:C++ 编程中的运算符重载

  1. #include <iostream>
  2. using namespace std;
  3. class Test
  4. {
  5. private:
  6. int count;
  7. public:
  8. Test(): count(5){}
  9. void operator ++()
  10. {
  11. count = count+1;
  12. }
  13. void Display() { cout<<"Count: "<<count; }
  14. };
  15. int main()
  16. {
  17. Test t;
  18. // this calls "function void operator ++()" function
  19. ++t;
  20. t.Display();
  21. return 0;
  22. }

输出

  1. Count: 6

++运算符对test类的对象(在这种情况下为对象t)进行操作时,将调用此函数。

在程序中,定义了void operator ++ ()运算符函数(在Test类内部)。

对于t对象,此函数将count的值加 1。


要记住的事情

  1. 运算符重载使您可以重新定义运算符仅对用户定义的类型(对象,结构)起作用的方式。 它不能用于内置类型(intfloatchar等)。
  2. 在 C++ 中,默认情况下已经重载了两个运算符=和&。 例如:要复制相同类的对象,可以直接使用=运算符。 您不需要创建运算符。
  3. 运算符重载不能更改运算符的优先级和关联。 但是,如果要更改求值顺序,则应使用括号。
  4. C++ 中有 4 个不能重载的运算符。 它们是::(范围分辨率),.(成员选择),.*(通过函数指针选择成员)和?:(三元运算符)。

使用运算符重载时遵循最佳实践

运算符重载允许您定义运算符的工作方式(所需的方式)。

在上面的示例中,++运算符对对象进行操作,以将数据成员count的值增加 1。

  1. void operator ++()
  2. {
  3. count = count+1;
  4. }

但是,如果使用以下代码。 当使用++运算符时,它会将count的值减小 100。

  1. void operator ++()
  2. {
  3. count = count-100;
  4. }

从技术上讲这可能是正确的。 但是,此代码令人困惑,并且难以理解和调试。

作为程序员,您要以适当的方式正确地使用操作符重载是您的工作。


在上面的示例中,当使用++运算符时,count的值增加 1。 但是,该程序在某种意义上是不完整的,您不能使用以下代码:

  1. t1 = ++t

这是因为运算符的返回类型为void

访问这些页面以了解更多信息: