C#学习笔记 -- 运算符重载

运算符重载

面对用户定义类型, 运算符不知道如何重载, 需要重载运算符

  • 运算符重载只能用于类和结构

  • 为类或结构后重载一个运算符x, 可以声明名称为opertor x的方法并实现他的行为 例如: operator + 和 operator -

    • 一元运算符的重载方法带一个单独的class或struct类型的参数

      public static 自定义类型 opertor -(自定义类型 var)
      {
         return 自定义类型数据;
      }
    • 二元运算符的重载方法带俩参数, 至少有一个必须是class 或 struct类型

      public static 自定义类型 opertor -(自定义类型 var, 类型 var)
      {
         return 自定义类型数据;
      }
  • 运算符必须是要操作的类或结构的成员

例子
static void Main(string[] args)
{
   LimitedInt li1 = new LimitedInt(10);
   LimitedInt li2 = new LimitedInt(26);
   LimitedInt li3 = new LimitedInt();
   li3 = -li1;
   Console.WriteLine($"取反{li3.TheValue}");//0
   li3 = li2 - li1;
   Console.WriteLine($"结果正数减法{li3.TheValue}"); //16
   li3 = li1 - li2;
   Console.WriteLine($"结果负数减法{li3.TheValue}");//0
   li3 = li2 + 1.0;
   Console.WriteLine($"浮点数加法{li3.TheValue}");//27
}
class LimitedInt
{
   const int MaxValue = 100;
   const int MinValue = 0;
   private int theValue = 0;
   public int TheValue
  {
       set
      {
           if (value < MinValue)
          {
               theValue = MinValue;
          }
           else
          {
               theValue = value > MaxValue ? MaxValue : value;
          }
      }
       get { return theValue; }
  }
   public LimitedInt(int theValue)
  {
       TheValue = theValue;
  }
   public LimitedInt()
  {
  }
   //-运算符重载 只有一个操作数 算是取反
   public static LimitedInt operator -(LimitedInt x)
  {
       return new LimitedInt(-x.TheValue);
  }
   //-运算符重载
   public static LimitedInt operator -(LimitedInt x, LimitedInt y)
  {
       return new LimitedInt(x.TheValue - y.TheValue);
  }
   //+运算符重载
   public static LimitedInt operator +(LimitedInt x, double y)
  {
       return new LimitedInt(x.TheValue + (int)y);
  }
}

(2)运算符重载限制

可重载的一元运算符 可重载的二元运算符
+, -, |, ~, ++, --, true, false +, -, *, /, %, &, |, ^, <<, >>, ==, !=, >, <, >=, <=
A.运算符重载不能规则
  • 创建新运算符

  • 改变运算符语法

  • 重新定义运算符如何处理预定义类型

  • 改变运算符的优先级或结合性

B. ++、--的限制
  • 在运行时++x会发生下列操作

    • 在对象上执行递增或递减代码

    • 返回对象

  • 在运行时x++会发生下列操作

    • 如果对象是值类型, 会复制该对象, 如果是引用类型, 则复制引用

    • 在对象上执行递增或递减, 引用类型是在原对象是进行了操作

    • 返回保存的操作数, 引用类型返回的还是原对象引用

  • 如果操作对象是值类型对象(结构体), ++ --无论前置还是后置都是没有影响的

  • 但是对于对象类型的

    • 前置操作++x, --x没有问题, 没有对对象进行复制

    • 后置操作x++, x--, 因为保存的副本是是引用的副本, 这意味着操作的对象一直都是同一个, 那么这个对象就不是起始状态, 返回对变化了的对象的引用可能不是预期行为, 返回的是已经做完操作的对象

例子
class MyType
{
   public int X;
   public MyType(int x)
  {
       X = x;
  }
   public static MyType operator ++(MyType m)
  {
       m.X++;
       return m;
  }
}
static void Main(string[] args)
{
   int i = 1;
   MyType myType = new MyType(1);
   Console.WriteLine($"int类型: {i++}"); //1
   Console.WriteLine($"自定义类型: {myType++.X}"); //2
}

posted on   老菜农  阅读(44)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律

导航

统计信息

点击右上角即可分享
微信分享提示