什么时候需要用到运算符重载?

C++

所谓运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。

自定义类的赋值运算符重载函数的作用与内置赋值运算符的作用类似,但是要要注意的是,它与拷贝构造函数与析构函数一样,要注意深拷贝浅拷贝的问题,在没有深拷贝浅拷贝的情况下,如果没有指定默认的赋值运算符重载函数,那么系统将会自动提供一个赋值运算符重载函数。

下面是Vector的定义—— 包含成员字段、构造函数和一个ToString()重写方法,以便查看Vector的内容,最后是运算符重载:

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结构的有趣部分—— 为+运算符提供支持的运算符重载:

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;

}

}

}

运算符重载的声明方式与方法的声明方式相同,但operator关键字告诉编译器,它实际上是一个运算符重载,后面是相关运算符的符号,在本例中就是+。返回类型是在使用这个运算符时获得的类型。在本例中,把两个矢量加起来会得到另一个矢量,所以返回类型就是Vector。对于这个+运算符重载,返回类型与包含类一样,但这种情况并不是必需的。两个参数就是要操作的对象。对于二元运算符(带两个参数),如+和-运算符,第一个参数是放在运算符左边的值,第二个参数是放在运算符右边的值。

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#的,其实大部分面向对象语言的运算符重载意思都是一样的。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-08-24
简单解释一下吧,如果楼主理解的话请笑纳,举个赋值运算符的例子:
在类对象还未存在的情况下,赋值过程是通过拷贝构造函数进行构造处理
但当对象已经存在,那么赋值过程就是通过赋值运算符重载函数处理
关于运算符重载的话,就是你平常操作的都是基本类型的操作,但如果你操作的不是基本类型的话,比如两个类对象之间的相加,这样的话不能直接用+运算符,所以只能重载+运算符来实现
相似回答