带有示例的 C++ 运算符重载
什么是运算符重载?
使用运算符重载 在 C++ 中,您可以为一个范围内的运算符指定多个含义。运算符重载的目的是为用户定义的数据类型提供运算符的特殊含义。
借助运算符重载,您可以重新定义大多数 C++ 运算符。您还可以使用运算符重载来使用一个运算符执行不同的操作。
在本 C++ 教程中,您将学习:
- 什么是运算符重载?
- 语法
- C++ 中运算符重载的不同方法
- 所有 C++ 运算符都可以重载吗?
- 要记住的事情:
- 运算符重载规则:
- 如何重载运算符:
语法
要重载 C++ 运算符,您应该在 Class 中定义一个特殊函数,如下所示:
class class_name { ... .. ... public return_type operator symbol (argument(s)) { ... .. ... } ... .. ... };
以下是对上述语法的解释:
- return_type 是函数的返回类型。
- 接下来,您提到了 operator 关键字。
- 符号表示要重载的运算符符号。例如,+、-、<、++。
- 参数可以像函数一样传递给操作符函数。
示例 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; }
输出:
下面是代码截图:
代码说明:
- 在我们的代码中包含 iostream 头文件以使用其功能。
- 在我们的程序中包含 std 命名空间,以便在不调用它的情况下使用它的类。
- 创建一个名为 TestClass 的类。
- 使用 private 访问修饰符,它将类成员标记为可私有访问。
- 创建一个整数变量count。此变量可以私下访问。
- 使用公共访问修饰符,它将类成员标记为可私有访问。
- 使用类构造函数将变量 counter 初始化为 5。
- 重载 -- 运算符的含义。
- 运算符会将变量 x 的值减 1。
- 运算符重载部分结束。操作员已获得新名称。
- 定义一个名为 Display() 的函数。
- 当调用 Display() 函数时,在控制台上打印变量计数的值以及其他文本。 } 标志着 Display() 函数主体的结束。
- 类主体结束。
- 调用 main() 函数。应在此函数中添加程序逻辑。
- 创建一个 TestClass 类的实例并将其命名为 tc。
- 这将调用 void 运算符 –() 函数。
- 使用TestClass Class的姿态调用Display()函数。
- 函数必须在成功完成后返回值。
- main() 函数体结束。
C++ 中运算符重载的不同方法
您可以通过实现以下任何类型的函数来执行运算符重载:
- 会员功能
- 非会员功能
- 好友功能
- 当左操作数是类的对象时,运算符重载函数可能是成员函数。
- 当左操作数不同时,运算符重载函数应该是非成员函数。
如果需要访问私有和受保护的类成员,可以将运算符重载函数设为友元函数。
是否可以重载所有 C++ 运算符?
不,有些 C++ 运算符不能重载。
它们包括:
- ::-范围解析运算符
- ?:- 三元运算符。
- 。 -成员选择器
- Sizeof 运算符
- * - 成员指针选择器
要记住的事情:
- 通过运算符重载,您可以重新定义运算符仅适用于用户定义的类型(对象、结构)的方式。您不能将其用于内置类型(float、char、int 等)。
- =和 &C++ 运算符默认被重载。例如,您可以使用 =运算符直接复制同一类的对象。
- 运算符优先级不会改变运算符的关联性和优先级。不过,您可以使用括号更改计算顺序。
- 有四个运算符不能在 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; }
输出:
下面是代码截图:
代码说明:
- 在我们的代码中包含 iostream 头文件以使用其功能。
- 在我们的程序中包含 std 命名空间,以便在不调用它的情况下使用它的类。
- 创建一个名为 OperatorOverload 的类。
- 使用 private 访问修饰符,它将类成员标记为可私有访问。
- 创建一个整数变量x。此变量可以私下访问。
- 使用公共访问修饰符,它将类成员标记为可私有访问。
- 使用类构造函数将变量 x 初始化为 10。
- 重载 ++ 运算符的含义。
- 运算符会将变量 x 的值增加 2。
- 运算符重载部分结束。操作员已获得新名称。
- 调用 Print() 函数。
- 调用 Print() 函数时,在控制台上打印变量 x 的值以及其他文本。
- Print() 函数主体的结尾。
- 类主体结束。
- 调用 main() 函数。应在此函数中添加程序逻辑。
- 创建一个名为 ov 的 OperatorOverload 类的实例。
- 这将调用 void 运算符 ++() 函数。
- 使用 OperatorOverload 类的姿态调用 Print() 函数。
- 函数必须在成功完成后返回值。
- 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(); }
输出:
下面是代码截图:
代码说明:
- 将 iostream 头文件包含到我们的程序中,以便使用它的功能。
- 将 std 命名空间包含到我们的程序中,以便在不调用它的情况下使用它的类。
- 创建一个名为 TestClass 的类。 { 标志着类主体的开始。
- 使用 private 访问修饰符将变量标记为私有,这意味着它们只能从类中访问。
- 定义两个整数变量,实数和超数。
- 使用 public 访问修饰符将构造函数标记为 public,这意味着即使在 Class 之外也可以访问它。
- 创建类构造函数并初始化变量。
- 初始化变量real的值。
- 初始化变量的值。
- 构造函数主体结束。
- 覆盖 + 运算符的含义。
- 创建TestClass类型的数据类型结果。
- 对复数使用 + 运算符。此行会将一个数字的实部添加到另一个数字的实部。
- 对复数使用 + 运算符。此行会将一个数字的虚部添加到另一个数字的虚部。
- 程序执行成功后会返回变量result的值。
- 结束+运算符新含义的定义,即重载。
- 调用 print() 方法。
- 在控制台打印添加后的新复数。
- print() 函数体结束。
- TestClass 类主体结束。
- 调用 main() 函数。
- 传递要添加的实部和复杂部分的值。 c1 的第一部分将添加到 c2 的第一部分,即 9+4。 c1的第二部分会和c的第二部分相加,即5+3。
- 使用重载的 + 运算符执行操作并将结果存储在变量 c3 中。
- 在控制台上打印变量 c3 的值。
- main() 函数体结束。
总结:
- 您可以在一个范围内为 C++ 运算符指定多个含义。
- 这称为运算符重载。
- 运算符重载为用户定义的数据类型提供了运算符的特殊含义。
- 您可以通过运算符重载重新定义大多数 C++ 运算符。
- 并非所有 C++ 运算符都可以重载。
- 对于要重载的运算符,至少有一个操作数必须是用户定义的对象。
- 只有现有的运算符可以重载。您不能重载新的运算符。
C语言