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
}