乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Delphi 的運算符重載(1)

       獨孤求財 2012-03-30

      其實 Delphi 2006 就已經(jīng)支持運算符重載了, 不過 for Win32 的版本只是在 record 里支持.

      運算符重載有什么用處呢? 舉個例子:
      譬如 "張三"、"李四" 兩人一起來拜見你, 你可能會問: "你們兩個誰大?"
      其實你是在問: "你們兩個誰的年齡大?"; 但生活中人們一般都不這么羅嗦.

      在程序中能否這樣簡化呢? 這只能通過 "運算符重載" 做到!

      先按 "你們兩個誰的年齡大?" 寫出原始例子吧:
      unit Unit1;
      
      interface
      
      uses
        Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
        Dialogs, StdCtrls;
      
      type
        TForm1 = class(TForm)
          Button1: TButton;
          procedure Button1Click(Sender: TObject);
        end;
      
      var
        Form1: TForm1;
      
      implementation
      
      {$R *.dfm}
      
      type
        TMyRec = record
          name: string;
          age: Word;
        end;
      
      procedure TForm1.Button1Click(Sender: TObject);
      var
        r1,r2: TMyRec;
        str: string;
      begin
        r1.name := '張三'; r1.age := 18;
        r2.name := '李四'; r2.age := 81;
      
        if r1.age > r2.age then
          str := r1.name
        else
          str := r2.name;
      
        ShowMessageFmt('%s年齡大', [str]); {李四年齡大}
      end;
      
      end.
      

      上面是用 r1.age > r2.age 對比年齡, 如果能用 r1 > r2 來對比的話, 那就相當于: "你們兩個誰大?" 了.

      這樣我們需要重載運算符 ">" ; 所謂重載運算符就是賦予某個運算符新的含義、新的功能.
      我們可以重載的運算符只能是 Delphi 已有的運算符(還不是全部); C++ 也是這樣.
      需要用對應(yīng)的指示字來表示這個運算符, 譬如: ">" 要用 GreaterThan 表示; C++ 不是這樣.
      重載運算符是通過方法實現(xiàn)的, 不過方法的指示字是 class operator (而非 function 或 proceture).

      譬如上面的 record 可以這樣聲明:
      type
        TMyRec = record
          name: string;
          age: Word;
          class operator GreaterThan(a,b: TMyRec): Boolean;
        end;

      還得有方法的實現(xiàn)(遺憾的是有些不能用 Ctrl+Shift+C 自動建立, 那就復(fù)制吧):
      class operator TMyRec.GreaterThan(a,b: TMyRec): Boolean; {注意復(fù)制后再加上方法名: "TMyRec."}
      begin
        Result := a.age > b.age;
      end;

      下面是完整的代碼:
      unit Unit1;
      
      interface
      
      uses
        Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
        Dialogs, StdCtrls;
      
      type
        TForm1 = class(TForm)
          Button1: TButton;
          procedure Button1Click(Sender: TObject);
        end;
      
      var
        Form1: TForm1;
      
      implementation
      
      {$R *.dfm}
      
      type
        TMyRec = record
          name: string;
          age: Word;
          class operator GreaterThan(a,b: TMyRec): Boolean;
        end;
      
      class operator TMyRec.GreaterThan(a,b: TMyRec): Boolean;
      begin
        Result := a.age > b.age;
      end;
      
      procedure TForm1.Button1Click(Sender: TObject);
      var
        r1,r2: TMyRec;
        str: string;
      begin
        r1.name := '張三'; r1.age := 18;
        r2.name := '李四'; r2.age := 81;
      
        if r1 > r2 then
          str := r1.name
        else
          str := r2.name;
      
        ShowMessageFmt('%s年齡大', [str]); {李四年齡大}
      end;
      
      end.
      

      這個測試里面有一些漏洞, 譬如: 年齡相等怎么辦? 不必較真, 只是借此說明一個道理而已.

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多