详细分析c# 运算符重载
您可以重定义或重载C#中内置的运算符。因此,程序员也可以使用用户自定义类型的运算符。重载运算符是具有特殊名称的函数,是通过关键字operator后跟运算符的符号来定义的。与其他函数一样,重载运算符有返回类型和参数列表。
例如,请看下面的函数:
publicstaticBoxoperator+(Boxb,Boxc)
{
Boxbox=newBox();
box.length=b.length+c.length;
box.breadth=b.breadth+c.breadth;
box.height=b.height+c.height;
returnbox;
}
上面的函数为用户自定义的类Box实现了加法运算符(+)。它把两个Box对象的属性相加,并返回相加后的Box对象。
运算符重载的实现
下面的程序演示了完整的实现:
usingSystem;
namespaceOperatorOvlApplication
{
classBox
{
privatedoublelength;//长度
privatedoublebreadth;//宽度
privatedoubleheight;//高度
publicdoublegetVolume()
{
returnlength*breadth*height;
}
publicvoidsetLength(doublelen)
{
length=len;
}
publicvoidsetBreadth(doublebre)
{
breadth=bre;
}
publicvoidsetHeight(doublehei)
{
height=hei;
}
//重载+运算符来把两个Box对象相加
publicstaticBoxoperator+(Boxb,Boxc)
{
Boxbox=newBox();
box.length=b.length+c.length;
box.breadth=b.breadth+c.breadth;
box.height=b.height+c.height;
returnbox;
}
}
classTester
{
staticvoidMain(string[]args)
{
BoxBox1=newBox();//声明Box1,类型为Box
BoxBox2=newBox();//声明Box2,类型为Box
BoxBox3=newBox();//声明Box3,类型为Box
doublevolume=0.0;//体积
//Box1详述
Box1.setLength(6.0);
Box1.setBreadth(7.0);
Box1.setHeight(5.0);
//Box2详述
Box2.setLength(12.0);
Box2.setBreadth(13.0);
Box2.setHeight(10.0);
//Box1的体积
volume=Box1.getVolume();
Console.WriteLine("Box1的体积:{0}",volume);
//Box2的体积
volume=Box2.getVolume();
Console.WriteLine("Box2的体积:{0}",volume);
//把两个对象相加
Box3=Box1+Box2;
//Box3的体积
volume=Box3.getVolume();
Console.WriteLine("Box3的体积:{0}",volume);
Console.ReadKey();
}
}
}
当上面的代码被编译和执行时,它会产生下列结果:
Box1的体积:210
Box2的体积:1560
Box3的体积:5400
可重载和不可重载运算符
下表描述了C#中运算符重载的能力:
| 运算符 | 描述 |
| +,-,!,~,++,-- | 这些一元运算符只有一个操作数,且可以被重载。 |
| +,-,*,/,% | 这些二元运算符带有两个操作数,且可以被重载。 |
| ==,!=,<,>,<=,>= | 这些比较运算符可以被重载。 |
| &&,|| | 这些条件逻辑运算符不能被直接重载。 |
| +=,-=,*=,/=,%= | 这些赋值运算符不能被重载。 |
| =,.,?:,->,new,is,sizeof,typeof | 这些运算符不能被重载。 |
实例
针对上述讨论,让我们扩展上面的实例,重载更多的运算符:
usingSystem;
namespaceOperatorOvlApplication
{
classBox
{
privatedoublelength;//长度
privatedoublebreadth;//宽度
privatedoubleheight;//高度
publicdoublegetVolume()
{
returnlength*breadth*height;
}
publicvoidsetLength(doublelen)
{
length=len;
}
publicvoidsetBreadth(doublebre)
{
breadth=bre;
}
publicvoidsetHeight(doublehei)
{
height=hei;
}
//重载+运算符来把两个Box对象相加
publicstaticBoxoperator+(Boxb,Boxc)
{
Boxbox=newBox();
box.length=b.length+c.length;
box.breadth=b.breadth+c.breadth;
box.height=b.height+c.height;
returnbox;
}
publicstaticbooloperator==(Boxlhs,Boxrhs)
{
boolstatus=false;
if(lhs.length==rhs.length&&lhs.height==rhs.height
&&lhs.breadth==rhs.breadth)
{
status=true;
}
returnstatus;
}
publicstaticbooloperator!=(Boxlhs,Boxrhs)
{
boolstatus=false;
if(lhs.length!=rhs.length||lhs.height!=rhs.height
||lhs.breadth!=rhs.breadth)
{
status=true;
}
returnstatus;
}
publicstaticbooloperator<(Boxlhs,Boxrhs)
{
boolstatus=false;
if(lhs.length(Boxlhs,Boxrhs)
{
boolstatus=false;
if(lhs.length>rhs.length&&lhs.height
>rhs.height&&lhs.breadth>rhs.breadth)
{
status=true;
}
returnstatus;
}
publicstaticbooloperator<=(Boxlhs,Boxrhs)
{
boolstatus=false;
if(lhs.length<=rhs.length&&lhs.height
<=rhs.height&&lhs.breadth<=rhs.breadth)
{
status=true;
}
returnstatus;
}
publicstaticbooloperator>=(Boxlhs,Boxrhs)
{
boolstatus=false;
if(lhs.length>=rhs.length&&lhs.height
>=rhs.height&&lhs.breadth>=rhs.breadth)
{
status=true;
}
returnstatus;
}
publicoverridestringToString()
{
returnString.Format("({0},{1},{2})",length,breadth,height);
}
}
classTester
{
staticvoidMain(string[]args)
{
BoxBox1=newBox();//声明Box1,类型为Box
BoxBox2=newBox();//声明Box2,类型为Box
BoxBox3=newBox();//声明Box3,类型为Box
BoxBox4=newBox();
doublevolume=0.0;//体积
//Box1详述
Box1.setLength(6.0);
Box1.setBreadth(7.0);
Box1.setHeight(5.0);
//Box2详述
Box2.setLength(12.0);
Box2.setBreadth(13.0);
Box2.setHeight(10.0);
//使用重载的ToString()显示两个盒子
Console.WriteLine("Box1:{0}",Box1.ToString());
Console.WriteLine("Box2:{0}",Box2.ToString());
//Box1的体积
volume=Box1.getVolume();
Console.WriteLine("Box1的体积:{0}",volume);
//Box2的体积
volume=Box2.getVolume();
Console.WriteLine("Box2的体积:{0}",volume);
//把两个对象相加
Box3=Box1+Box2;
Console.WriteLine("Box3:{0}",Box3.ToString());
//Box3的体积
volume=Box3.getVolume();
Console.WriteLine("Box3的体积:{0}",volume);
//comparingtheboxes
if(Box1>Box2)
Console.WriteLine("Box1大于Box2");
else
Console.WriteLine("Box1不大于Box2");
if(Box1=Box2)
Console.WriteLine("Box1大于等于Box2");
else
Console.WriteLine("Box1不大于等于Box2");
if(Box1<=Box2)
Console.WriteLine("Box1小于等于Box2");
else
Console.WriteLine("Box1不小于等于Box2");
if(Box1!=Box2)
Console.WriteLine("Box1不等于Box2");
else
Console.WriteLine("Box1等于Box2");
Box4=Box3;
if(Box3==Box4)
Console.WriteLine("Box3等于Box4");
else
Console.WriteLine("Box3不等于Box4");
Console.ReadKey();
}
}
}
当上面的代码被编译和执行时,它会产生下列结果:
Box1:(6,7,5)
Box2:(12,13,10)
Box1的体积:210
Box2的体积:1560
Box3:(18,20,15)
Box3的体积:5400
Box1不大于Box2
Box1小于Box2
Box1不大于等于Box2
Box1小于等于Box2
Box1不等于Box2
Box3等于Box4
以上就是详细分析c#运算符重载的详细内容,更多关于c#运算符重载的资料请关注毛票票其它相关文章!