一,什么是运算符重载(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. Java序列化及反序列化

    序列化概念: 1.Java序列化与反序列化  Java序列化是指把Java对象转换为字节序列的过程:而Java反序列化是指把字节序列恢复为Java对象的过程. 2.为什么需要序列化与反序列化 我们知道 ...

  2. 操作数据库结构Sql语句

    新建表: create table [表名] ( ,) PRIMARY KEY , ) default '默认值' null , [字段2] ntext null , [字段3] datetime, ...

  3. BZOJ 2982: combination Lucas模板题

    Code: #include<bits/stdc++.h> #define ll long long #define maxn 1000003 using namespace std; c ...

  4. 22 October in 614

    Contest A. defile struct 自定义排序.按照题意抽象成模型模拟就可以了. 自定义排序核心代码: struct node { int x, id; } d[1000003]; bo ...

  5. Android setXfermode 模式

    参考:http://onewayonelife.iteye.com/blog/1169176  setXfermode  设置两张图片相交时的模式  我们知道 在正常的情况下,在已有的图像上绘图将会在 ...

  6. linux设备驱动第二篇:构造和运行模块

      上一篇介绍了Linux驱动的概念,以及linux下设备驱动的基本分类情况及其各个分类的依据和差异,这一篇我们来描述如何写一个类似hello world的简单测试驱动程序.而这个驱动的唯一功能就是输 ...

  7. soj#547 bzoj5046 分糖果游戏

    分析 代码 #include<bits/stdc++.h> using namespace std; #define int long long ; ][],s[],p[],v[]; si ...

  8. 加载的DAL数据访问层的类型

    using System; using System.Collections; using System.Reflection; using CSFrameworkV4_5.Core; using C ...

  9. 正则split的使用

    import re #\s 空格 +号表示至少出现一次 # path = 'C:\\Users\\cz\Desktop\py06\\PY6_Day01\\爬虫作业\\2018_03_07\\05_sp ...

  10. C语言|博客作业6

    一.本周教学内容&目标 第3章 分支结构 3.1-3.2 使学生熟悉多分支结构.字符型数据类型和逻辑运算符. 二.本周作业头 问题 答案 这个作业属于那个课程 C语言程序设计II 这个作业要求 ...