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; }
输出
这是代码的屏幕截图:
代码解释
- 在代码中包含 iostream 头文件以使用其函数。
- 在程序中包含 std 命名空间,以便在使用其类时无需调用它。
- 创建一个名为 TestClass 的类。
- 使用 private 访问修饰符,它将类成员标记为私有可访问。
- 创建一个整数变量 count。该变量将是私有可访问的。
- 使用 public 访问修饰符,它将类成员标记为私有可访问。
- 使用类构造函数将变量 counter 初始化为 5。
- 重载 — 运算符的含义。
- 该运算符会将变量 x 的值减 1。
- 运算符重载部分的结束。该运算符已获得新名称。
- 定义一个名为 Display() 的函数。
- 当调用 Display() 函数时,将 count 变量的值与控制台上的其他文本一起打印。} 标记 Display() 函数体的结束。
- 类主体的结束。
- 调用 main() 函数。程序逻辑应在此函数内添加。
- 创建 TestClass 类的实例,并将其命名为 tc。
- 这将调用 void operator –() 函数。
- 使用 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 的整数变量。该变量将是私有可访问的。
- 使用 public 访问修饰符,它将类成员标记为私有可访问。
- 使用类构造函数初始化变量 x 为 10。
- 重载 ++ 运算符的含义。
- 该运算符会将变量 x 的值增加 2。
- 运算符重载部分的结束。该运算符已获得新名称。
- 调用 Print() 函数。
- 当调用 Print() 函数时,将 x 变量的值与控制台上的其他文本一起打印。
- Print() 函数体的结束。
- 类主体的结束。
- 调用 main() 函数。程序逻辑应在此函数内添加。
- 创建 OperatorOverload Class 的实例,命名为 ov。
- 这将调用 void operator ++() 函数。
- 使用 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 访问修饰符将变量标记为 private,这意味着它们只能在类内部访问。
- 定义两个整数变量 real 和 over。
- 使用 public 访问修饰符将构造函数标记为 public,这意味着它在类外部也是可访问的。
- 创建类构造函数并初始化变量。
- 初始化 real 变量的值。
- 初始化 over 变量的值。
- 构造函数体的结束。
- 重载 + 运算符的含义。
- 创建 TestClass 类型的 result 数据类型。
- 对复数使用 + 运算符。此行会将一个数字的实部加到另一个数字的实部。
- 对复数使用 + 运算符。此行会将一个数字的虚部加到另一个数字的虚部。
- 程序将在成功执行后返回 result 变量的值。
- 重载的 + 运算符的新含义定义的结束,即重载。
- 调用 print() 方法。
- 将相加后的新复数打印在控制台上。
- print() 函数体的结束。
- TestClass Class 主体的结束。
- 调用 main() 函数。
- 将实部和复部的值传递给要相加。c1 的第一部分将与 c2 的第一部分相加,即 9+4。c1 的第二部分将与 c 的第二部分相加,即 5+3。
- 使用重载的 + 运算符执行操作,并将结果存储在变量 c3 中。
- 将 c3 变量的值打印在控制台上。
- main() 函数主体的结束。
摘要
- 您可以在一个作用域内为C++ 运算符指定多种含义。
- 这称为运算符重载。
- 运算符重载为用户定义的数据类型提供了运算符的特殊含义。
- 您可以通过运算符重载重新定义大多数 C++ 运算符。
- 并非所有 C++ 运算符都可以重载。
- 要重载运算符,至少一个操作数必须是用户定义的类的对象。
- 只能重载现有运算符。您不能重载新运算符。