久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

MQL5

 AIANT 2020-06-29

MQL5-構造函數(shù)和析構函數(shù)

構造函數(shù)是一種特殊函數(shù),,當創(chuàng)建結構或類的對象時自動調(diào)用并且通常用來初始化類成員。 從更長遠來看我們將只看重類,,并且同樣應用于架構中,,除非是另行定義。構造函數(shù)的名稱要與類函數(shù)的名稱匹配,。構造函數(shù)不需要返回類型(您可以指定空型 ),。

定義類成員 – 字符串 動態(tài)數(shù)組和需要初始化的對象 – 無論如何都需要初始化,不管構造函數(shù)是否存在,。

每個類可以有多個構造函數(shù),,根據(jù)參數(shù)數(shù)量和初始化列表而有所不同。需要指定參數(shù)的構造函數(shù)稱為參數(shù)構造函數(shù),。

無參數(shù)構造函數(shù)被稱為缺省構造函數(shù),。如果一個類中沒有聲明構造函數(shù),編譯器會在編譯過 程中創(chuàng)建一個缺省構造函數(shù),。

//+------------------------------------------------------------------+ //| 處理日期的類 | //+------------------------------------------------------------------+ class MyDateClass { private: int m_year; // 年 int m_month; // 月 int m_day; // 幾月幾日 int m_hour; // 某天幾時 int m_minute; // 分鐘 int m_second; // 秒 public: //--- 缺省構造函數(shù) MyDateClass(void); //--- 參數(shù)構造函數(shù) MyDateClass(int h,int m,int s); };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

構造函數(shù)可以在類描述中聲明,,然后定義主體。例如,,MyDateClass的兩個構造函數(shù)可以定義如下:

//+------------------------------------------------------------------+  //| 默認構造函數(shù)                                                       |  //+------------------------------------------------------------------+  MyDateClass::MyDateClass(void)   {  //--       MqlDateTime mdt;       datetime t=TimeCurrent(mdt);       m_year=mdt.year;       m_month=mdt.mon;       m_day=mdt.day;       m_hour=mdt.hour;       m_minute=mdt.min;       m_second=mdt.sec;       Print(__FUNCTION__);      }  //+------------------------------------------------------------------+  //| 參數(shù)構造函數(shù)                                                       |  //+------------------------------------------------------------------+  MyDateClass::MyDateClass(int h,int m,int s)   {      MqlDateTime mdt;      datetime t=TimeCurrent(mdt);     m_year=mdt.year;      m_month=mdt.mon;      m_day=mdt.day;      m_hour=h;      m_minute=m;      m_second=s;      Print(__FUNCTION__);     } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

在 默認構造函數(shù),,類的所有成員都使用TimeCurrent() 函數(shù),在參數(shù)構造函數(shù),,只有小時值在使用,。其他的類成員 (m_year, m_month 和 m_day) 將自動初始化當前日期。

當初始化類的對象數(shù)組時,,默認構造函數(shù)有一個特殊用途。所有參數(shù)都有默認值的構造函數(shù),, 并不是默認構造函數(shù),。示例如下:

//+------------------------------------------------------------------+ //| 默認構造函數(shù)的類 | //+------------------------------------------------------------------+ class CFoo { datetime m_call_time; // 最近一次對象調(diào)用時間 public: //--- 帶有默認值參數(shù)的構造函數(shù)不是默認構造函數(shù) CFoo(const datetime t=0){m_call_time=t;}; //--- 復制構造函數(shù) CFoo(const CFoo &foo){m_call_time=foo.m_call_time;}; string ToString(){return(TimeToString(m_call_time,TIME_DATE|TIME_SECONDS));}; }; //+------------------------------------------------------------------+ //| 腳本程序開始函數(shù) | //+------------------------------------------------------------------+ void OnStart() { // CFoo foo; // 該變量不能使用 - 沒有設置默認構造函數(shù) //--- 創(chuàng)建 CFoo 對象的可能選項 CFoo foo1(TimeCurrent()); // 參數(shù)構造函數(shù)的顯式調(diào)用 CFoo foo2(); // 帶有默認參數(shù)的參數(shù)構造函數(shù)的顯式調(diào)用 CFoo foo3=D'2009.09.09'; // 參數(shù)構造函數(shù)的隱式調(diào)用 CFoo foo40(foo1); // 復制構造函數(shù)的顯式調(diào)用 CFoo foo41=foo1; // 復制構造函數(shù)的隱式調(diào)用 CFoo foo5; // 默認構造函數(shù)的顯式調(diào)用(如果沒有默認構造函數(shù),那么帶有默認值的參數(shù)構造函數(shù)被調(diào)用) //--- 接收 CFoo 指針的可能選項 CFoo *pfoo6=new CFoo(); // 動態(tài)創(chuàng)建對象和接收其指針 CFoo *pfoo7=new CFoo(TimeCurrent());// 另一個動態(tài)對象創(chuàng)建的選項 CFoo *pfoo8=GetPointer(foo1); // 現(xiàn)在 pfoo8 指向?qū)ο?foo1 CFoo *pfoo9=pfoo7; // pfoo9 和 pfoo7 指向一個和相同的對象 // CFoo foo_array[3]; // 該選項不能使用 - 沒有指定默認構造函數(shù) //--- 顯示m_call_time值 Print('foo1.m_call_time=',foo1.ToString()); Print('foo2.m_call_time=',foo2.ToString()); Print('foo3.m_call_time=',foo3.ToString()); Print('foo4.m_call_time=',foo4.ToString()); Print('foo5.m_call_time=',foo5.ToString()); Print('pfoo6.m_call_time=',pfoo6.ToString()); Print('pfoo7.m_call_time=',pfoo7.ToString()); Print('pfoo8.m_call_time=',pfoo8.ToString()); Print('pfoo9.m_call_time=',pfoo9.ToString()); //--- 刪除動態(tài)創(chuàng)建數(shù)組 delete pfoo6; delete pfoo7; //刪除 pfoo8; // 您不需要一定刪除pfoo8,,因為它指向自動創(chuàng)建的對象foo1 //刪除 pfoo9; // 您不需要一定刪除pfoo9,,因為它指向pfoo7相同的對象 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

如果您取消這些字符串

 //CFoo foo_array[3];     // 該變量不能使用 - 沒有設置默認構造函數(shù) 
  • 1

//CFoo foo_dyn_array[]; // 該變量不能使用 - 沒有設置默認構造函數(shù)
  • 1

然后編譯器將會返回一個錯誤“ 默認構造函數(shù)未定義” 。

如果類有用戶定義構造函數(shù),,編譯器就不會生成默認構造函數(shù),。這意味著如果一個類中聲明參數(shù)構造函數(shù),但未聲明默認構造函數(shù),,則您不能聲明類對象的數(shù)組,。編譯器將返回這個腳本錯誤:

//+------------------------------------------------------------------+  //| 無默認構造函數(shù)的類                                                  |  //+------------------------------------------------------------------+  class CFoo   {    string            m_name;  public:                     CFoo(string name) { m_name=name;}   };  //+------------------------------------------------------------------+  //| 腳本程序開始函數(shù)                                                    |  //+------------------------------------------------------------------+  void OnStart()   {  //--- 編譯過程中收到“默認構造函數(shù)未定義”的錯誤    CFoo badFoo[5];   } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

在該示例中,CFoo 類擁有聲明的參數(shù)構造函數(shù)在這種情況下,編譯器在編譯過程中不能自動創(chuàng)建默認構造函數(shù),。同時當您聲明對象數(shù)組時,,假設所有對象應該自動創(chuàng)建和初始化。 對象自動初始化過程中,,需要調(diào)用默認構造函數(shù),,但由于默認構造函數(shù)不是顯式聲明并且不會通過 編譯器自動生成,所以不可能創(chuàng)建這種對象,。因此,,編譯器在編譯階段會生成一個錯誤。

有一個使用構造函數(shù)初始化對象的特殊語法,。結構和類成員的構造函數(shù)初始化軟件(特殊結構初始化)可以在初始化列表中指定,。

初始化列表就是通過逗號隔開的初始化軟件列表,它在構造函數(shù)參數(shù)列表后主體前(左大括號前)的冒號后面,。它有以下幾點要求:

  • 初始化列表僅能用于構造函數(shù)
  • 父成員不能在初始化列表中初始化
  • 初始化列表必須遵循一個函數(shù) 定義 (實施)
    這是一個用于初始化類成員的幾個構造函數(shù)的示例,。
//+------------------------------------------------------------------+ //| 存儲字符名稱的類 | //+------------------------------------------------------------------+ class CPerson { string m_first_name; // 第一名稱 string m_second_name; // 第二名稱 public: //--- 空默認構造函數(shù) CPerson() {Print(__FUNCTION__);}; //--- 參數(shù)構造函數(shù) CPerson(string full_name); //--- 初始化列表的構造函數(shù) CPerson(string surname,string name): m_second_name(surname), m_first_name(name) {}; void PrintName(){PrintFormat('Name=%s Surname=%s',m_first_name,m_second_name);}; }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ CPerson::CPerson(string full_name) { int pos=StringFind(full_name,' '); if(pos>=0) { m_first_name=StringSubstr(full_name,0,pos); m_second_name=StringSubstr(full_name,pos+1); } } //+------------------------------------------------------------------+ //|腳本程序開始函數(shù) | //+------------------------------------------------------------------+ void OnStart() { //--- 收到“默認構造函數(shù)未定義”的錯誤 CPerson people[5]; CPerson Tom='Tom Sawyer'; // 湯姆 索亞 CPerson Huck('Huckleberry','Finn'); // 哈克貝利 費恩 CPerson *Pooh = new CPerson('Winnie','Pooh'); // 維尼熊 //--- 輸出值 Tom.PrintName(); Huck.PrintName(); Pooh.PrintName(); //--- 刪除一個動態(tài)創(chuàng)建的對象 delete Pooh; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

在這種情況下,CPerson 類有三種構造函數(shù):

  1. 顯式默認構造函數(shù),, 允許創(chuàng)建該類對象的數(shù)組,;
  2. 單參數(shù)構造函數(shù),會得到一個作為參數(shù)的完整名稱并根據(jù)發(fā)現(xiàn)的空間分成名稱和第二名稱,;
  3. 雙參數(shù)的構造函數(shù)包含初始化列表,。初始化軟件 m_second_name(姓)和 m_first_name (名)。
    注意使用列表初始化已經(jīng)替代了一個任務,。個體成員必須初始化為:
 class_member (表達式列表) 
  • 1

在初始化列表,,成員可按任意順序排列,但所有的類成員將會根據(jù)它們公告的順序初始化,。這意味著在第三構造函數(shù),,第一個m_first_name成員將會初始化,因為它是最先公告的,,并且僅在 m_second_name初始化之后,。如果一些類成員的初始化取決于其他類成員的值,則應該將此考慮其中,。

如果默認構造函數(shù)沒有在基本類聲明,,而同時聲明一個或多個參數(shù)函數(shù),您應該保持調(diào)用初始化列表中的一個基本類的構造函數(shù),。它作為列表普通成員用逗號分隔并且無論初始化列表位于哪里,,都在對象初始化時被最先調(diào)用。

//+------------------------------------------------------------------+ //| 基本類 | //+------------------------------------------------------------------+ class CFoo { string m_name; public: //--- 初始化列表的構造函數(shù) CFoo(string name) : m_name(name) { Print(m_name);} }; //+------------------------------------------------------------------+ //| 派生自CFoo 的類 | //+------------------------------------------------------------------+ class CBar : CFoo { CFoo m_member; // 類成員是父對象 public: //--- 初始化列表中的默認構造函數(shù)調(diào)用父構造函數(shù) CBar(): m_member(_Symbol), CFoo('CBAR') {Print(__FUNCTION__);} }; //+------------------------------------------------------------------+ //| 腳本程序開始函數(shù) | //+------------------------------------------------------------------+ void OnStart() { CBar bar; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

例如,,創(chuàng)建柱對象時,,將會調(diào)用默認構造函數(shù)CBar(),,這里首先調(diào)用父CFoo構造函數(shù),然后是 m_member類成員的構造函數(shù),。

析構函數(shù)是一種特殊功能,,當類目標被破壞時自動調(diào)用,析構函數(shù)的名稱用波浪字符(~)以分類 名輸入,。串型數(shù)據(jù),、動態(tài)數(shù)組和目標函數(shù),不管破壞函數(shù)是否出現(xiàn),,無論如何都不會初始化,。如 果存在破壞函數(shù),該行為在召回破壞者后會執(zhí)行,。

破壞函數(shù)總是虛擬的 ,,無論虛擬值存在與否。

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多