一架梯子,一头程序猿,仰望星空!

Dart 运算符重载


熟悉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支持重载的运算符:

<	+	|	[]
>	/	^	[]=
<=	~/	&	~
>=	*	<<	==
–	%	>>