C++ Operator 重载示例
什么是 Operator 是否超载?
运用 操作符重载 in C++,可以在一个作用域内为一个运算符指定多个含义。运算符重载的目的是为用户定义的数据类型提供运算符的特殊含义。
借助运算符重载,你可以重新定义大多数 C++ 运算符。您还可以使用运算符重载,从而使用一个运算符执行不同的运算。
句法
要超载 C++ 运算符,您应该在类内部定义一个特殊的函数,如下所示:
class class_name { ... .. ... public return_type operator symbol (argument(s)) { ... .. ... } ... .. ... };
以下是对上述语法的解释:
- return_type 是函数的返回类型。
- 接下来,提到运算符关键字。
- 符号表示要重载的运算符号。例如,+、-、<、++。
- 参数可以按照与函数相同的方式传递给运算符函数。
例子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 的类。
- 使用私有访问修饰符,将类成员标记为私有可访问。
- 创建一个整数变量 count。此变量将是私有可访问的。
- 使用公共访问修饰符,将类成员标记为私有可访问。
- 使用类构造函数将变量计数器初始化为 5。
- 重载—运算符的含义。
- 该运算符将变量 x 的值减 1。
- 运算符重载部分结束。运算符已被赋予新名称。
- 定义一个名为Display()函数。
- 调用 Display() 函数时,在控制台上打印变量 count 的值以及其他文本。 } 标记 Display() 函数体的结尾。
- 课堂主体结束。
- 调用main()函数。程序逻辑应该添加到此函数中。
- 创建 TestClass 类的一个实例并将其命名为 tc。
- 这将调用 void operator-() 函数。
- 使用TestClass类的立场调用Display()函数。
- 该函数成功完成后必须返回值。
- 函数 main() 主体结束。
不同的方法 Operator 重载 C++
您可以通过实现以下任何类型的函数来执行运算符重载:
- 成员函数
- 非成员函数
- 友元函数
- 当左操作数是类的对象时,运算符重载函数可能是成员函数。
- 当左操作数不同时, Operator重载函数应该是非成员函数。
如果需要访问私有和受保护的类成员,您可以使运算符重载函数成为友元函数。
都可以 C++ Opera器是否超载?
没有。有 C++ 不可重载的运算符。
这些措施包括:
- ::-范围解析运算符
- ?:-三元运算符。
- . -成员选择器
- Sizeof 运算符
- * -成员指针选择器
要记住的事情
- 使用运算符重载,您可以重新定义运算符的工作方式,但仅限于用户定义类型(对象、结构)。您不能将其用于内置类型(float、char、int 等)。
- = 和 & C++ 运算符默认是重载的。例如,你可以直接使用=运算符复制同一个Class的对象。
- Opera运算符的优先级不会改变其结合性和优先级。但是,您可以使用括号来改变求值的顺序。
- 有四个运算符不能重载 C++。它们包括范围解析运算符(::)、成员选择运算符(.)、通过指向函数的指针进行成员选择运算符(.*)和三元运算符(?:)。
规则 Operator 过载
以下是规则 Operator 重载:
- 为了使其工作,至少一个操作数必须是用户定义的类对象。
- 您只能重载现有的运算符。您不能重载新的运算符。
- 有些运算符不能通过友元函数重载。但是,这些运算符可以通过成员函数重载。
如何超载 Opera器
例子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。
- 使用私有访问修饰符,将类成员标记为私有可访问。
- 创建一个整数变量 x。此变量将是私有访问的。
- 使用公共访问修饰符,将类成员标记为私有可访问。
- 使用类构造函数将变量 x 初始化为 10。
- 重载++运算符的含义。
- 该运算符将变量 x 的值增加 2。
- 运算符重载部分结束。运算符已被赋予新名称。
- 调用 Print() 函数。
- 当调用 Print() 函数时,在控制台上打印变量 x 的值以及其他文本。
- Print() 函数体结束。
- 课堂主体结束。
- 调用main()函数。程序逻辑应该添加到此函数中。
- 创建一个实例 OperatorOverload 类名为 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 访问修饰符将变量标记为私有,这意味着它们只能从类内部访问。
- 定义两个整数变量,real 和 over。
- 使用公共访问修饰符将构造函数标记为公共,这意味着它甚至可以在类之外访问。
- 创建类构造函数并初始化 变量.
- 初始化变量real的值。
- 初始化变量的值。
- 构造函数主体结束。
- 覆盖 + 运算符的含义。
- 创建TestClass类型的数据类型结果。
- 对复数使用 + 运算符。此行将一个数的实部添加到另一个数的实部。
- 对复数使用 + 运算符。此行将一个数的虚部添加到另一个数的虚部。
- 程序执行成功后将返回变量result的值。
- 结束定义+运算符的新含义,即重载。
- 调用 print() 方法。
- 在控制台上打印加法后的新复数。
- print() 函数体结束。
- TestClass 类主体结束。
- 调用 main() 函数。
- 传递要相加的实部和复部的值。c1 的第一部分将添加到 c2 的第一部分,即 9+4。c1 的第二部分将添加到 c 的第二部分,即 5+3。
- 使用重载 + 运算符执行运算并将结果存储在变量 c3 中。
- 在控制台上打印变量 c3 的值。
- main() 函数体结束。
总结
- 您可以为 C++ 操作者 在一个范围内。
- 这称为运算符重载。
- Operator重载为用户定义的数据类型提供了运算符的特殊含义。
- 你可以重新定义大多数 C++ 通过运算符重载来实现运算符。
- 不是所有的 C++ 运算符可以重载。
- 对于要重载的运算符,至少一个操作数必须是用户定义的对象。
- 仅可重载现有运算符。您无法重载新的运算符。