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; } }
|
不可重载的运算符
- 逻辑与
&&
逻辑或 ||
- 索引符
[]
- 强转运算符
()
- 特殊运算符:点
.
、三目运算符 ? :
、赋值符号 =