什么是C#运算符重载?
所谓运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。
自定义类的赋值运算符重载函数的作用与内置赋值运算符的作用类似,但是要要注意的是,它与拷贝构造函数与析构函数一样,要注意深拷贝浅拷贝的问题,在没有深拷贝浅拷贝的情况下,如果没有指定默认的赋值运算符重载函数,那么系统将会自动提供一个赋值运算符重载函数。
下面是Vector的定义—— 包含成员字段、构造函数和一个ToString()重写方法,以便查看Vector的内容,***是C#运算符重载:
- namespace Wrox.ProCSharp.OOCSharp
- {
- struct Vector
- {
- public double x, y, z;
- public Vector(double x, double y, double z)
- {
- this.x = x;
- this.y = y;
- this.z = z;
- }
- public Vector(Vector rhs)
- {
- x = rhs.x;
- y = rhs.y;
- z = rhs.z;
- }
- public override string ToString()
- {
- return "( " + x + " , " + y + " , " + z + " )";
- }
这里提供了两个构造函数,通过传递每个元素的值,或者提供另一个复制其值的Vector,来指定矢量的初始值。第二个构造函数带一个Vector参数,通常称为复制构造函数,因为它们允许通过复制另一个实例来初始化一个类或结构实例。注意,为了简单起见,把字段设置为public。也可以把它们设置为private,编写相应的属性来访问它们,这样做不会改变这个程序的功能,只是代码会复杂一些。
下面是Vector结构的有趣部分—— 为+运算符提供支持的C#运算符重载:
- public static Vector operator + (Vector lhs, Vector rhs)
- {
- Vector result = new Vector(lhs);
- result.x += rhs.x;
- result.y += rhs.y;
- result.z += rhs.z;
- return result;
- }
- }
- }
C#运算符重载的声明方式与方法的声明方式相同,但operator关键字告诉编译器,它实际上是一个运算符重载,后面是相关运算符的符号,在本例中就是+。返回类型是在使用这个运算符时获得的类型。在本例中,把两个矢量加起来会得到另一个矢量,所以返回类型就是Vector。对于这个+运算符重载,返回类型与包含类一样,但这种情况并不是必需的。两个参数就是要操作的对象。对于二元运算符(带两个参数),如+和-运算符,***个参数是放在运算符左边的值,第二个参数是放在运算符右边的值。
C#要求所有的C#运算符重载都声明为public和static,这表示它们与它们的类或结构相关联,而不是与实例相关联,所以运算符重载的代码体不能访问非静态类成员,也不能访问this标识符;这是可以的,因为参数提供了运算符执行任务所需要知道的所有数据。
前面介绍了声明运算符+的语法,下面看看运算符内部的情况:
- {
- Vector result = new Vector(lhs);
- result.x += rhs.x;
- result.y += rhs.y;
- result.z += rhs.z;
- return result;
- }
这部分代码与声明方法的代码是完全相同的,显然,它返回一个矢量,其中包含前面定义的lhs和rhs的和,即把x、y和z分别相加。
下面需要编写一些简单的代码,测试Vector结构:
- static void Main()
- {
- Vector vect1, vect2, vect3;
- vect1 = new Vector(3.0, 3.0, 1.0);
- vect2 = new Vector(2.0,­­­–4.0,–4.0);
- vect3 = vect1 + vect2;
- Console.WriteLine("vect1 = " + vect1.ToString());
- Console.WriteLine("vect2 = " + vect2.ToString());
- Console.WriteLine("vect3 = " + vect3.ToString());
- }
把这些代码保存为Vectors.cs,编译并运行它,结果如下:
- Vectors
- vect1 = ( 3 , 3 , 1 )
- vect2 = ( 2 ,–4 ,–4 )
- vect3 = ( 5 ,–1 ,–3 )
C#运算符重载不能用于Java。
C#运算符重载的相关内容就向你介绍到这里,希望对你了解C#运算符重载有所帮助。
【编辑推荐】