C++ 运算符重载及示例

什么是运算符重载?

在 C++ 中使用运算符重载,您可以在一个作用域内为运算符指定多种含义。运算符重载的目的是为用户定义的数据类型提供运算符的特殊含义。

借助运算符重载,您可以重新定义大多数 C++ 运算符。您还可以使用运算符重载通过一个运算符执行不同的操作。

语法

要重载 C++ 运算符,您应该在类中定义一个特殊函数,如下所示:

class class_name
{
    ... .. ...
    public
       return_type operator symbol (argument(s))
       {
           ... .. ...
       } 
    ... .. ...
};

以下是对上述语法的解释:

  • return_type 是函数的返回类型。
  • 接下来,您提到 operator 关键字。
  • symbol 表示要重载的运算符符号。例如,+、-、<、++。
  • 参数可以像函数一样传递给运算符函数。

示例 1

#include <iostream>
using namespace std;
class TestClass {
private:
	int count;
public:
	TestClass() : count(5) {}
	void operator --() {
		count = count - 3;
	}
	void Display() { 

		cout << "Count: " << count; }
};

int main() {
	TestClass tc;
	--tc;
	tc.Display();
	return 0;
}

输出

 Operator Overloading

这是代码的屏幕截图:

 Operator Overloading

代码解释

  1. 在代码中包含 iostream 头文件以使用其函数。
  2. 在程序中包含 std 命名空间,以便在使用其类时无需调用它。
  3. 创建一个名为 TestClass 的类。
  4. 使用 private 访问修饰符,它将类成员标记为私有可访问。
  5. 创建一个整数变量 count。该变量将是私有可访问的。
  6. 使用 public 访问修饰符,它将类成员标记为私有可访问。
  7. 使用类构造函数将变量 counter 初始化为 5。
  8. 重载 — 运算符的含义。
  9. 该运算符会将变量 x 的值减 1。
  10. 运算符重载部分的结束。该运算符已获得新名称。
  11. 定义一个名为 Display() 的函数。
  12. 当调用 Display() 函数时,将 count 变量的值与控制台上的其他文本一起打印。} 标记 Display() 函数体的结束。
  13. 类主体的结束。
  14. 调用 main() 函数。程序逻辑应在此函数内添加。
  15. 创建 TestClass 类的实例,并将其命名为 tc。
  16. 这将调用 void operator –() 函数。
  17. 使用 TestClass Class 的实例调用 Display() 函数。
  18. 函数在成功完成后必须返回值。
  19. main() 函数体的结束。

C++ 中运算符重载的各种方法

您可以通过实现以下任何类型的函数来执行运算符重载:

  1. 成员函数
  2. 非成员函数
  3. 友元函数
  • 当左操作数是类对象时,运算符重载函数可以是成员函数。
  • 当左操作数不同时,运算符重载函数应为非成员函数。

如果运算符重载函数需要访问私有和受保护的类成员,则可以将其设为友元函数。

所有 C++ 运算符都可以重载吗?

否。有些 C++ 运算符无法重载。

它们包括:

  • :: - 作用域解析运算符
  • ?: - 三元运算符。
  • . - 成员选择符
  • sizeof 运算符
  • * - 成员指针选择符

注意事项

  1. 通过运算符重载,您可以仅为用户定义类型(对象、结构)重新定义运算符的工作方式。您不能将其用于内置类型(float、char、int 等)。
  2. C++ 中的 = 和 & 运算符已默认重载。例如,您可以使用 = 运算符直接复制同一类的对象。
  3. 运算符的优先级不改变运算符的结合性和优先级。但是,您可以使用括号更改求值顺序。
  4. C++ 中有四个不能重载的运算符。它们包括作用域解析运算符 (::)、成员选择运算符 (.)、指向函数成员的选择运算符 (.*) 和三元运算符 (?:)。

运算符重载规则

以下是运算符重载规则:

  • 为了使其正常工作,至少一个操作数必须是用户定义的类对象。
  • 您只能重载现有运算符。您不能重载新运算符。
  • 有些运算符不能使用友元函数重载。但是,这些运算符可以使用成员函数重载。

如何重载运算符

示例 1

#include <iostream>   
using namespace std;
class OperatorOverload {
private:
	int x;

public:
	OperatorOverload() : x(10) {}
	void operator ++() {
		x = x + 2;
	}
	void Print() {
		cout << "The Count is: " << x;
		}
};
int main() {
	OperatorOverload ov;
	++ov;   
	ov.Print();
	return 0;
}

输出

Overload Operator Example

这是代码的屏幕截图:

Overload Operator Example

代码解释

  1. 在代码中包含 iostream 头文件以使用其函数。
  2. 在程序中包含 std 命名空间,以便在使用其类时无需调用它。
  3. 创建一个名为 OperatorOverload 的类。
  4. 使用 private 访问修饰符,它将类成员标记为私有可访问。
  5. 创建一个名为 x 的整数变量。该变量将是私有可访问的。
  6. 使用 public 访问修饰符,它将类成员标记为私有可访问。
  7. 使用类构造函数初始化变量 x 为 10。
  8. 重载 ++ 运算符的含义。
  9. 该运算符会将变量 x 的值增加 2。
  10. 运算符重载部分的结束。该运算符已获得新名称。
  11. 调用 Print() 函数。
  12. 当调用 Print() 函数时,将 x 变量的值与控制台上的其他文本一起打印。
  13. Print() 函数体的结束。
  14. 类主体的结束。
  15. 调用 main() 函数。程序逻辑应在此函数内添加。
  16. 创建 OperatorOverload Class 的实例,命名为 ov。
  17. 这将调用 void operator ++() 函数。
  18. 使用 OperatorOverload 类的实例调用 Print() 函数。
  19. 函数在成功完成后必须返回值。
  20. main() 函数体的结束。

示例 2

#include<iostream> 
using namespace std;

class TestClass {
private:
	int real, over;
public:
	TestClass(int rl = 0, int ov = 0) {
		real = rl;
		over = ov;
	}

	TestClass operator + (TestClass const &obj) {
		TestClass result;
		result.real = real + obj.real;
		result.over = over + obj.over;
		return result;
	}
	void print() {
		cout << real << " + i" << over << endl;
	}
};
int main()
{
	TestClass c1(9, 5), c2(4, 3);
	TestClass c3 = c1 + c2;
	c3.print();
}

输出

Overload Operator Example

这是代码的屏幕截图:

Overload Operator Example

代码解释

  1. 将 iostream 头文件包含到我们的程序中,以便使用其函数。
  2. 将 std 命名空间包含到我们的程序中,以便在不调用它的情况下使用其类。
  3. 创建一个名为 TestClass 的类。{ 标记类体的开始。
  4. 使用 private 访问修饰符将变量标记为 private,这意味着它们只能在类内部访问。
  5. 定义两个整数变量 real 和 over。
  6. 使用 public 访问修饰符将构造函数标记为 public,这意味着它在类外部也是可访问的。
  7. 创建类构造函数并初始化变量
  8. 初始化 real 变量的值。
  9. 初始化 over 变量的值。
  10. 构造函数体的结束。
  11. 重载 + 运算符的含义。
  12. 创建 TestClass 类型的 result 数据类型。
  13. 对复数使用 + 运算符。此行会将一个数字的实部加到另一个数字的实部。
  14. 对复数使用 + 运算符。此行会将一个数字的虚部加到另一个数字的虚部。
  15. 程序将在成功执行后返回 result 变量的值。
  16. 重载的 + 运算符的新含义定义的结束,即重载。
  17. 调用 print() 方法。
  18. 将相加后的新复数打印在控制台上。
  19. print() 函数体的结束。
  20. TestClass Class 主体的结束。
  21. 调用 main() 函数。
  22. 将实部和复部的值传递给要相加。c1 的第一部分将与 c2 的第一部分相加,即 9+4。c1 的第二部分将与 c 的第二部分相加,即 5+3。
  23. 使用重载的 + 运算符执行操作,并将结果存储在变量 c3 中。
  24. 将 c3 变量的值打印在控制台上。
  25. main() 函数主体的结束。

摘要

  • 您可以在一个作用域内为C++ 运算符指定多种含义。
  • 这称为运算符重载。
  • 运算符重载为用户定义的数据类型提供了运算符的特殊含义。
  • 您可以通过运算符重载重新定义大多数 C++ 运算符。
  • 并非所有 C++ 运算符都可以重载。
  • 要重载运算符,至少一个操作数必须是用户定义的类的对象。
  • 只能重载现有运算符。您不能重载新运算符。