CS3L11——运算符重载
本章代码关键字
运算符重载
让自定义类和结构体,能够使用运算符,使用关键字 operator
- 特点:一定是一个公共的静态方法,返回值写在
operator 前,逻辑处理自定义
- 作用:使自定义类和结构体对象可以进行运算
- 注意:条件运算符需要成对实现,一个符号可以多个重载,不能使用
ref 和 out
运算符重载声明语法和使用
基本语法:
1
| public static 返回类型 operator 运算符(参数列表)
|
声明和使用示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| class Point { public int x; public int y; public static Point operator +(Point p1, Point p2) { Point p = new Point(); p.x = p1.x + p2.x; p.y = p1.y + p2.y; return p; }
public static Point operator +(int value, Point p1) { Point p = new Point(); p.x = p1.x + value; p.y = p1.y + value; return p; }
public static Point operator +(Point p1, int value) { Point p = new Point(); p.x = p1.x + value; p.y = p1.y + value; return p; } }
internal class Program { static void Main(string[] args) { Point point1 = new Point(); point1.x = 1; point1.y = 1; Point point2 = new Point(); point2.x = 2; point2.y = 2;
Point point3 = point1 + point2;
Point point4 = point3 + 2; Point point5 = 2 + point4; } }
|
可重载的运算符
算数运算符
+ - * / % 需要两个参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| class Point { public static Point operator +(short value, Point p1) { return null; } public static Point operator -(Point p1, Point p2) { return null; } public static Point operator *(Point p1, Point p2) { return null; } public static Point operator /(Point p1, Point p2) { return null; } public static Point operator %(Point p1, Point p2) { return null; } }
|
++ 和 -- 只能有一个参数
1 2 3 4 5 6 7 8 9 10 11
| class Point { public static Point operator ++(Point p1) { return null; } public static Point operator --(Point p1) { return null; } }
|
逻辑运算符
只有非 ! 可以运算符重载
1 2 3 4 5 6 7
| class Point { public static Point operator !(Point p1) { return null; } }
|
位运算符
位或 位与 异或 | & ^ 需要两个参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class Point { public static Point operator |(Point p1, Point p2) { return null; } public static Point operator &(Point p1, Point p2) { return null; } public static Point operator ^(Point p1, Point p2) { return null; } }
|
取反 ~ 只需要一个参数
1 2 3 4 5 6 7
| class Point { public static Point operator ~(Point p1) { return null; } }
|
左移 右移 << >> 需要一个任意类型和int类型为参数
1 2 3 4 5 6 7 8 9 10 11 12
| class Point { public static Point operator <<(Point p1, int value) { return null; } public static Point operator >>(Point p1, int value) { return null; } }
|
条件运算符
注意 条件运算符需要成对实现 即 < 对 > , <= 对 >= , == 对 !=,返回值一般是 bool,但也允许是其他类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| class Point { public static bool operator <(Point p1, Point p2) { return false; } public static bool operator >(Point p1, Point p2) { return false; } public static bool operator <=(Point p1, Point p2) { return false; } public static bool operator >=(Point p1, Point p2) { return false; } public static bool operator ==(Point p1, Point p2) { return false; } public static bool operator !=(Point p1, Point p2) { return false; } }
|
不可重载的运算符
- 逻辑与
&& 逻辑或 ||
- 索引符
[]
- 强转运算符
()
- 特殊运算符:点
. 、三目运算符 ? : 、赋值符号 =