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 2023-05-23 23:09  老菜农  阅读(26)  评论(0编辑  收藏  举报

导航