C#学习笔记(九):运算符重载

本文介绍了如何在C#中实现运算符重载,包括一元运算符、二元运算符及比较运算符的重载方法,并通过示例展示了不同类对象间运算的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先看看运算符重载的基本语法。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

要重载运算符,可以给类添加运算符类型成员(它们必须是static)。

我们先看一个简单的类:

     public class AddClass1

     {

         public int val;

     }

这仅是int值的一个包装器(wrapper),但可以用于说明规则。

对于这个类下面的代码不能编译:

              AddClass1 op1 = new AddClass1();

              op1.val = 5;

              AddClass1 op2 = new AddClass1();

              op2.val = 5;

              AddClass1 op3 = op1 + op2;

其错误是+运算符不能应用于AddClass1类型的操作数,因为我们还没有定义要执行的操作。

虽然下面的代码可以执行,但是得不到我们希望的结果:

              AddClass1 op1 = new AddClass1();

              op1.val = 5;

              AddClass1 op2 = new AddClass1();

              op2.val = 5;

              bool op3 = op1 == op2;

这仅是使用二元运算符==判断op1op2是否引用的用一个对象,而不是验证他们的值是否相等。在这段代码中,即使op1.valop2.val相等,op3也是false。因为它们引用的并不是同一个对象。

 

我们使用下面的方法来实现对+运算符的重载。

     public class AddClass1

     {

         public int val;

 

         public static AddClass1 operator +(AddClass1 op1, AddClass1 op2)

         {

              AddClass1 returnVal = new AddClass1();

              returnVal.val = op1.val + op2.val;

              return returnVal;

         }

     }

重载所有的二元运算符基本上都和这个相似。一元运算符看起来也是类似的,但是只有一个参数。

         public static AddClass1 operator -(AddClass1 op1)

         {

              AddClass1 returnVal = new AddClass1();

              returnVal.val = - op1.val;

              return returnVal;

         }

 

下面我们再看一个不同类的对象运算的例子。

     public class AddClass1

     {

         public int val;

 

         public static AddClass3 operator +(AddClass1 op1, AddClass2 op2)

         {

              AddClass3 returnVal = new AddClass3();

              returnVal.val = op1.val + op2.val;

              return returnVal;

         }

     }

 

     public class AddClass2

     {

         public int val;

     }

 

     public class AddClass3

     {

         public int val;

     }

对于这种类型的定义下面的代码也是可以执行的:

              AddClass1 op1 = new AddClass1();

              op1.val = 5;

              AddClass2 op2 = new AddClass2();

              op2.val = 5;

              AddClass3 op3 = op1 + op2;

这是因为在AddClass1中定义的加运算符仅适合于AddClass1AddClass2相加然后赋值给AddClass3对象。而且顺序必须是AddClass1对象在前,AddClass2对象在后的这种相加,如果要颠倒顺序,除非我们按照颠倒的顺序在进行一个运算符的重载,否则是不支持这种算法的。

 

下述运算符可以重载:

一元运算符:+, -, !,  ~, ++, --, true, false

二元运算符:+, -, *, /, %, &, |, ^, <<, >>

比较运算符:==, !=, <, >, <=, >=

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值