目录
简介
什么是重载运算符
利用现有的某种运算符,针对自定义类或者结构,来定义某种运算操作。
为什么需要重载运算符
利用现有的运算符,简化自定义类型的操作。最好是,该运算符和该操作符,具有一定的相关性。
可以重载的运算符 | 不可以重载的运算符 |
---|---|
+ 加法 | = 赋值运算符 |
- 减法(一元和二元) | ?: 条件运算符(三元运算符) |
* 乘法 | :: 作用域解析运算符 |
/ 除法 | new 对象实例化运算符 |
% 取模 | is 类型检查运算符 |
& 位与 | as 类型转换运算符 |
^ 位异或 | sizeof 大小运算符 |
|| 逻辑或 | checked unchecked 检查上下文运算符 |
&& 逻辑与 | delegate 委托运算符 |
== 等于 != 不等于 | stackalloc 栈分配运算符 |
<< 左移位 | |
>> 右移位 |
语法
public static 返回值 operator重载运算符()
{
}
使用规则
-
运算符重载的声明: 运算符重载必须在自定义类型(类或结构体)中声明,并且必须是
public
或public static
的方法。每个运算符重载方法必须使用operator
关键字声明。 -
运算符重载的方法签名: 每个运算符重载方法必须使用特定的签名。例如,
+
运算符的重载方法必须接受两个参数并返回一个值。 -
对称性: 如果你重载了
+
运算符,那么你也应该重载-
、*
和其他相关的运算符,以保持操作的一致性。 -
运算符的限制: 不是所有运算符都可以重载。例如,
.
(成员访问运算符)和::
(范围解析运算符)无法重载。
示例
using System;
public class Point
{
public int X { get; set; }
public int Y { get; set; }
public Point(int x, int y)
{
X = x;
Y = y;
}
// 重载 + 运算符
public static Point operator +(Point p1, Point p2)
{
return new Point(p1.X + p2.X, p1.Y + p2.Y);
}
// 重载 - 运算符
public static Point operator -(Point p1, Point p2)
{
return new Point(p1.X - p2.X, p1.Y - p2.Y);
}
// 重写 ToString 方法以便于输出 Point 对象
public override string ToString()
{
return $"({X}, {Y})";
}
}
public class Program
{
public static void Main()
{
Point p1 = new Point(3, 4);
Point p2 = new Point(1, 2);
// 使用重载的 + 运算符
Point sum = p1 + p2;
Console.WriteLine($"Sum: {sum}"); // 输出: Sum: (4, 6)
// 使用重载的 - 运算符
Point difference = p1 - p2;
Console.WriteLine($"Difference: {difference}"); // 输出: Difference: (2, 2)
Console.ReadKey();
}
}
使用场景
- 数学运算:自定义数学类,如复数、矩阵等,可以通过运算符重载实现直观的数学运算。
- 比较操作:自定义比较类型(如自定义的时间、货币类型)可以通过运算符重载实现直观的比较操作。
- 集合操作:自定义集合类(如自定义的集合类型)可以通过运算符重载实现集合操作,如并集、交集等