熟悉c++的人,都了解重载运算符,其实就是重新定义运算符作用在对象的时候的含义。
例如,1 + 2 = 3,数值相加,Dart语言默认可以算出来,那么我们自定义类B的实例对象a + 对象b = ? 这个默认Dart无法算出来,所以需要我们在类B实现两个对象相加如何处理。
重载运算符的函数的语法格式:
函数返回值 operator 运算符(运算符参数) {
// 实现运算符重载逻辑
}
双目运算符,指的就是+、-、*、/、>、< 等等 这些需要两个操作数的运算符,那么运算符参数一般就是对象自己。
例子:
// 定义一个Point代表一个坐标点
class Point {
// 拥有两个属性代表x,y坐标
final int x, y;
Point(this.x, this.y);
// 重载 + 号运算符, 两个point对象相加,就是对应的x和y相加,然后返回一个新的Point对象
Point operator +(Point v) => Point(x + v.x, y + v.y);
// 重载 [] 号运算符, 接受int参数, 当然也可以接受String参数。
Point operator [](int index) {
// 这里简单的将index参数分别乘以x,y并且返回新的Point对象
return Point(index * x, index * y);
}
// 重载 < 号运算符, 实现两个对象比较, 返回bool值
bool operator <(Point v) => x < v.x && y < v.y;
// 重载toString方法,定义打印对象的时候输出的内容
String toString() => "x=$x,y=$y";
}
void main() {
// 定义两个Point对象
final v = Point(3, 5);
final w = Point(2, 2);
// 两个对象相加
var p = v + w;
print(p);
// 像个对象比较
if (w < v) {
print("w 小于 v");
}
// 使用[]运算符
var n = v[2];
print(n);
}
输出:
x=5,y=7
w 小于 v
x=6,y=10
下面是Dart支持重载的运算符:
< + | []
> / ^ []=
<= ~/ & ~
>= * << ==
– % >>