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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律