CS3L11——运算符重载

本章代码关键字

1
operator        //运算符重载关键字

运算符重载

让自定义类和结构体,能够使用运算符,使用关键字 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;
//注意 运算符重载的两个参数的类型 至少要有一个 是当前所在的类,例如,两个参数类型都是int这种情况就不允许
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;
}

//注意 这样只能实现 类的实例化对象 + int值,而不能做到 int值 + 类的实例化对象,如果要实现需要自行再重载运算符,代码如下
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
{
//左移 右移 需要一个任意类型和int类型为参数
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
{
//注意 条件运算符需要成对实现 即 < 对 > , <= 对 >= , == 对 !=
//返回值一般是bool,但也允许是其他类型
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;
}
}

不可重载的运算符

  • 逻辑与 &&​ 逻辑或 ||
  • 索引符 []
  • 强转运算符 ()
  • 特殊运算符:点 .​ 、三目运算符 ? :​ 、赋值符号 =