日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

【dart学习】之运算符重载

發(fā)布時(shí)間:2024/8/26 综合教程 24 生活家
生活随笔 收集整理的這篇文章主要介紹了 【dart学习】之运算符重载 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一,什么是運(yùn)算符重載(operator overloading)

在軟件開(kāi)發(fā)過(guò)程中,運(yùn)算符重載(英語(yǔ):operator overloading)是多態(tài)的一種。運(yùn)算符重載通常只是一種語(yǔ)法糖,這種語(yǔ)法對(duì)語(yǔ)言的功能沒(méi)有影響,但是更方便程序員使用。讓程序更加簡(jiǎn)潔,有更高的可讀性。

二,語(yǔ)法糖的現(xiàn)實(shí)意義

在日常工作過(guò)程中,我們讀代碼讀機(jī)會(huì)往往超過(guò)寫代碼,軟件工程是門協(xié)作的藝術(shù)

我們寫的代碼主要是給機(jī)器和人看的,給機(jī)器看的可以通過(guò)代碼測(cè)試和實(shí)際運(yùn)行來(lái)進(jìn)行檢驗(yàn),給人的目前還沒(méi)太好的評(píng)價(jià)方式。不過(guò)在設(shè)計(jì)一門語(yǔ)言的時(shí)候,方便閱讀也是語(yǔ)言設(shè)計(jì)重點(diǎn)考慮的一個(gè)方面。

運(yùn)算符重載在功能實(shí)現(xiàn)方面并沒(méi)有任何影響,但是會(huì)給未來(lái)的自己和其他程序員帶來(lái)極大的便利。

三,operator關(guān)鍵字

operator 是 Dart 的一個(gè)關(guān)鍵字,它和運(yùn)算符(如=)一起使用,表示一個(gè) 運(yùn)算符重載函數(shù),在理解時(shí)可將operator和運(yùn)算符(如operator=)視為一個(gè)函數(shù)名。

使用 operator 重載運(yùn)算符,是 Dar 擴(kuò)展運(yùn)算符功能的方法。使用 operator 擴(kuò)展運(yùn)算符功能的原因如下:

使重載后的運(yùn)算符的使用方法與重載前一致
擴(kuò)展運(yùn)算符的功能只能通過(guò)函數(shù)的方式實(shí)現(xiàn)

對(duì)于 Dart 提供的所有操作符,通常只支持對(duì)于基本數(shù)據(jù)類型和標(biāo)準(zhǔn)庫(kù)中提供的類的操作,而對(duì)于用戶自己定義的類,如果想要通過(guò)該操作符實(shí)現(xiàn)一些基本操作(比如比較大小,判斷是否相等),就需要用戶自己來(lái)定義關(guān)于這個(gè)操作符的具體實(shí)現(xiàn)了。

比如,我們要設(shè)計(jì)一個(gè)名為“person”的類,現(xiàn)在要判斷person類的兩個(gè)對(duì)象p1和p2是否一樣大,我們?cè)O(shè)計(jì)的比較規(guī)則是按照其年齡來(lái)比較,那么,在設(shè)計(jì)person類的時(shí)候,就可以通過(guò)對(duì)操作符“==”進(jìn)行重載,來(lái)使用操作符“==”對(duì)對(duì)象p1和p2

進(jìn)行比較了(根據(jù)前面的分析,實(shí)際上比較的內(nèi)容應(yīng)該是person類中的數(shù)據(jù)成員“age”)。

我們上面說(shuō)的對(duì)操作符“==”進(jìn)行重載,說(shuō)是“重載”,是由于編譯器在實(shí)現(xiàn)操作符“==”功能的時(shí)候,已經(jīng)為我們提供了這個(gè)操作符對(duì)于一些基本數(shù)據(jù)類型的操作支持,只不過(guò)由于現(xiàn)在該操作符所操作的內(nèi)容變成了我們自定義的數(shù)據(jù)類型(如

class),而默認(rèn)情況下,該操作符是不能對(duì)我們自定義的class類型進(jìn)行操作的,所以,就需要我們通過(guò)重載該操作符,給出該操作符操作我們自定義的class類型的方法,從而達(dá)到使用該操作符對(duì)我們自定義的class類型進(jìn)行運(yùn)算的目的。

四,實(shí)現(xiàn)一個(gè)操作符重載的方式通常分為兩種情況  

(1)將操作符重載實(shí)現(xiàn)為類的成員函數(shù);
(2)操作符重載實(shí)現(xiàn)為非類的成員函數(shù)(即全局函數(shù))

將操作符重載實(shí)現(xiàn)為類的成員函數(shù);

在類體中聲明(定義)需要重載的操作符,聲明方式跟普通的成員函數(shù)一樣,只不過(guò)操作符重載函數(shù)的名字是“關(guān)鍵字 operator +以及緊跟其后的一個(gè) Dart 預(yù)定義的操作符”,樣式如下(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;
}

通過(guò)上述代碼能夠知道:因?yàn)椴僮鞣剌d函數(shù)“operator==”是person類的一個(gè)成員函數(shù),所以對(duì)象p1、p2都可以調(diào)用該函數(shù)。其中的if (p1 == p2)語(yǔ)句,相當(dāng)于對(duì)象p1調(diào)用函數(shù)“operator==”,把對(duì)象p2作為一個(gè)參數(shù)傳遞給該函數(shù),從而實(shí)現(xiàn)了兩個(gè)對(duì)象的比較。

操作符重載實(shí)現(xiàn)為非類的成員函數(shù)(即全局函數(shù))

對(duì)于全局重載操作符,代表左操作數(shù)的參數(shù)必須被顯式指定。

示例代碼如下:

class Person
{
  public int age;
};
 
// 左操作數(shù)的類型必須被顯式指定
// 此處指定的類型為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; }

重載后操作符的操作數(shù)至少有一個(gè)是用戶定義類型;
不能違反原來(lái)操作數(shù)的語(yǔ)法規(guī)則;
不能創(chuàng)建新的操作符;
不能重載的操作符包括(以空格分隔):sizeof . .* :: ?: RTTI類型運(yùn)算符
=、()、[]、以及 ->操作符只能被類的成員函數(shù)重載

五,Dart語(yǔ)言的運(yùn)算符重載實(shí)例

第一步創(chuàng)建個(gè)類

class Role{
  final String name;
  final int accessLevel;
  
  const Role(this.name,this.accessLevel);
}

main()
{
  print('hello  operator overloading');
}

第二步 通過(guò)函數(shù)實(shí)現(xiàn)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('報(bào)告員',2);
  var userRole= new Role('用戶',1);
  if(adminRole.accessLevel > reporterRole.accessLevel){
    print("管理員的權(quán)限大于報(bào)告員");
  }  
  if(reporterRole.accessLevel > userRole.accessLevel){
    print("報(bào)告員的權(quán)限大于用戶");
  }  
}

第三步 重載運(yùn)算符

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('報(bào)告員', 2);
  var userRole = new Role('用戶', 1);
  if (adminRole > reporterRole) {
    print("管理員的權(quán)限大于報(bào)告員");
  }
  if (reporterRole > userRole) {
    print("報(bào)告員的權(quán)限大于用戶");
  }
}

總結(jié)

以上是生活随笔為你收集整理的【dart学习】之运算符重载的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。