一,什么是运算符重载(operator overloading)

在软件开发过程中,运算符重载(英语:operator overloading)是多态的一种。运算符重载通常只是一种语法糖,这种语法对语言的功能没有影响,但是更方便程序员使用。让程序更加简洁,有更高的可读性。

二,语法糖的现实意义

在日常工作过程中,我们读代码读机会往往超过写代码,软件工程是门协作的艺术

我们写的代码主要是给机器和人看的,给机器看的可以通过代码测试和实际运行来进行检验,给人的目前还没太好的评价方式。不过在设计一门语言的时候,方便阅读也是语言设计重点考虑的一个方面。

运算符重载在功能实现方面并没有任何影响,但是会给未来的自己和其他程序员带来极大的便利。

三,operator关键字

operator 是 Dart 的一个关键字,它和运算符(如=)一起使用,表示一个 运算符重载函数,在理解时可将operator和运算符(如operator=)视为一个函数名。

使用 operator 重载运算符,是 Dar 扩展运算符功能的方法。使用 operator 扩展运算符功能的原因如下:

  • 使重载后的运算符的使用方法与重载前一致
  • 扩展运算符的功能只能通过函数的方式实现

对于 Dart 提供的所有操作符,通常只支持对于基本数据类型和标准库中提供的类的操作,而对于用户自己定义的类,如果想要通过该操作符实现一些基本操作(比如比较大小,判断是否相等),就需要用户自己来定义关于这个操作符的具体实现了。

比如,我们要设计一个名为“person”的类,现在要判断person类的两个对象p1和p2是否一样大,我们设计的比较规则是按照其年龄来比较,那么,在设计person类的时候,就可以通过对操作符“==”进行重载,来使用操作符“==”对对象p1和p2

进行比较了(根据前面的分析,实际上比较的内容应该是person类中的数据成员“age”)。

我们上面说的对操作符“==”进行重载,说是“重载”,是由于编译器在实现操作符“==”功能的时候,已经为我们提供了这个操作符对于一些基本数据类型的操作支持,只不过由于现在该操作符所操作的内容变成了我们自定义的数据类型(如

class),而默认情况下,该操作符是不能对我们自定义的class类型进行操作的,所以,就需要我们通过重载该操作符,给出该操作符操作我们自定义的class类型的方法,从而达到使用该操作符对我们自定义的class类型进行运算的目的。

四,实现一个操作符重载的方式通常分为两种情况  

(1)将操作符重载实现为类的成员函数;
(2)操作符重载实现为非类的成员函数(即全局函数)
  • 将操作符重载实现为类的成员函数;

    在类体中声明(定义)需要重载的操作符,声明方式跟普通的成员函数一样,只不过操作符重载函数的名字是“关键字 operator +以及紧跟其后的一个 Dart 预定义的操作符”,样式如下(person是我们定义的类):

     bool operator==(const person& ps)
    {
    if (this->age == ps.age)
    {
    return true;
    }
    return false;
    }
    示例代码operator_test2.cpp)如下:
    class Person
    {
    int age;
    public Person(int nAge){
    this->age = nAge;
    } bool operator==(Person ps){
    if (this.age == ps.age) {
    return true;
    }
    return false;
    }
    }; int main()
    {
    Person p1 = new Person(10);
    Person p2 = new Person(10); if (p1 == p2) { } else { }
    return 0;
    }

    通过上述代码能够知道:因为操作符重载函数“operator==”是person类的一个成员函数,所以对象p1、p2都可以调用该函数。其中的 if (p1 == p2) 语句,相当于对象p1调用函数“operator==”,把对象p2作为一个参数传递给该函数,从而实现了两个对象的比较。

  • 操作符重载实现为非类的成员函数(即全局函数)

    对于全局重载操作符,代表左操作数的参数必须被显式指定。

    示例代码如下:

    class Person
    {
      public int age;
    }; // 左操作数的类型必须被显式指定
    // 此处指定的类型为person类
    bool operator==(Person p1 ,Person p2)
    {
    if (p1.age == p2.age)
    {
    return true;
    }
    else
    {
    return false;
    }
    } int main()
    {
    Person p1 = new Person();
    Person p2 = new Person();
    p1.age = 18;
    p2.age = 18; if (p1 == p2){ }else{
    }
    return 0;
    }

    重载后操作符的操作数至少有一个是用户定义类型;
    不能违反原来操作数的语法规则;
    不能创建新的操作符;
    不能重载的操作符包括(以空格分隔):sizeof . .* :: ?: RTTI类型运算符
    =、()、[]、以及 ->操作符只能被类的成员函数重载

五,Dart语言的运算符重载实例

  • 第一步创建个类

    class Role{
    final String name;
    final int accessLevel; const Role(this.name,this.accessLevel);
    } main()
    {
    print('hello operator overloading');
    }
  • 第二步 通过函数实现Role比较

    class Role{
    final String name;
    final int accessLevel; const Role(this.name,this.accessLevel);
    } main()
    {
    var adminRole =new Role('管理员',3);
    var reporterRole = new Role('报告员',2);
    var userRole= new Role('用户',1);
    if(adminRole.accessLevel > reporterRole.accessLevel){
    print("管理员的权限大于报告员");
    }
    if(reporterRole.accessLevel > userRole.accessLevel){
    print("报告员的权限大于用户");
    }
    }
  • 第三步 重载运算符

    class Role {
    final String name;
    final int _accessLevel; const Role(this.name, this._accessLevel);
    bool operator >(Role Other) {
    return this._accessLevel > Other._accessLevel;
    } bool operator <(Role Other) {
    return this._accessLevel < Other._accessLevel;
    }
    } main() {
    var adminRole = new Role('管理员', 3);
    var reporterRole = new Role('报告员', 2);
    var userRole = new Role('用户', 1);
    if (adminRole > reporterRole) {
    print("管理员的权限大于报告员");
    }
    if (reporterRole > userRole) {
    print("报告员的权限大于用户");
    }
    }
 

【dart学习】之运算符重载的更多相关文章

  1. C++学习之运算符重载的总结

    C++学习之运算符重载的总结              运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用域不同类型的数据导致不同行为的发生,C++为运算符重载提供了一种方法,即运算符重载函数 ...

  2. Dart学习笔记-运算符-条件表达式-类型转换

    Dart学习笔记-运算符-条件表达式-类型转换 一.运算符 1.算术运算符 + (加)- (减)* (乘)/ (除)~/ (取整) %(取余) 2.关系运算符 == (等等) != (不等) > ...

  3. 我的c++学习(8)运算符重载和友元

    运算符的重载,实际是一种特殊的函数重载,必须定义一个函数,并告诉C++编译器,当遇到该运算符时就调用此函数来行使运算符功能.这个函数叫做运算符重载函数(常为类的成员函数). 方法与解释 ◆ 1.定义运 ...

  4. C++学习26 运算符重载的概念和语法

    所谓重载,就是赋予新的含义.函数重载(Function Overloading)可以让一个函数名有多种功能,在不同情况下进行不同的操作.运算符重载(Operator Overloading)也是一个道 ...

  5. C++学习笔记-运算符重载

    运算符重载使得用户自定义的数据以一种更简洁的方式工作 运算符重载规则 重载运算符的限制 可以重载的运算符 + - * / % ^ & | ~ ! = < > += -= *= /= ...

  6. STL学习之运算符(<<)重载问题和仿函数的实现

    /*   运算符<<的重载一直报错,   友原函数中可以访问到类的私有成员*/#include<iostream>using namespace std; class MyIn ...

  7. 运算符重载+日期类Date

    Hello,一只爱学习的鱼 大学学习C++运算符重载的时候,老师出了一道"运算符重载+类"的综合练习题,让我们来一起看看吧! 题目: 设计一个日期类Date,包括年.月.日等私有成 ...

  8. C++学习笔记之运算符重载

    一.运算符重载基本知识 在前面的一篇博文 C++学习笔记之模板(1)——从函数重载到函数模板 中,介绍了函数重载的概念,定义及用法,函数重载(也被称之为函数多态)就是使用户能够定义多个名称相同但特征标 ...

  9. 初步C++运算符重载学习笔记&lt;3&gt; 增量递减运算符重载

    初步C++运算符重载学习笔记<1> 初探C++运算符重载学习笔记<2> 重载为友元函数     增量.减量运算符++(--)分别有两种形式:前自增++i(自减--i).后自增i ...

随机推荐

  1. iOS 常用随机数

    比如:获取一个随机整数范围在:[0,100)包括0,不包括100 ; 参考:https://www.jianshu.com/p/106475cbd3da

  2. LUOGU P3759 [TJOI2017]不勤劳的图书管理员(树套树)

    传送门 解题思路 和以前做过的一道题有点像,就是区间逆序对之类的问题,用的是\(BIT\)套权值线段树,交换时讨论一下计算答案..跑的不如暴力快.. 代码 #include<iostream&g ...

  3. SPOJ - FTOUR2 (点分治+树状数组)

    题目:https://vjudge.net/contest/307753#problem/I 题意:有一颗树,上面有白色黑色点,每个点上有一个权值,权值可以为负,现在我要求一条路径,权值和最大,这条路 ...

  4. [CSP-S模拟测试]:w(树上DP)

    题目背景 $\frac{1}{4}$遇到了一道水题,双完全不会做,于是去请教小$D$.小$D$看了${0.607}^2$眼就切掉了这题,嘲讽了$\frac{1}{4}$一番就离开了.于是,$\frac ...

  5. python中global的作用域

    #python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量 . ''' a=30 声明为全局变量 a=20 为test()函 ...

  6. PHP curl get post请求

    POST请求: public function postUrl($url, $postData = false, $header = false) { $ch = curl_init($url); c ...

  7. Qt文件夹遍历

    void FindFile(const QString &_filepath) { QDir dir(_filepath); for each (QFileInfo mfile in dir. ...

  8. 提高redis cluster集群的安全性,增加密码验证

    节点设置密码 1.修改配置文件 在配置文件里面增加密码选项,一定要加上masterauth,不然Redirected的时候会失败. masterauth redispassword requirepa ...

  9. mysql null 值查询问题

    我在开发公司内部的一个项目时遇到一个问题:select student_quality_id from STUDENT_QUALITY where mark_status=0 and batch_st ...

  10. appium常见问题02_android内嵌H5页(webview)如何定位

    现在大多数app都是由原生页面和内嵌H5(即webview)组成,app原生页面直接定位即可,那内嵌H5页面要如何定位呢. 相信大多数人用appium做自动化时都有遇到这个问题,小编总结了下工作中该问 ...