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

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

    • 分享

      操作符重載

       阿貍 2010-04-25
      1.有四個操作符不允許重載,它們是:: .* . ?:
      2.程序員只能為類類型或枚舉類型的操作數(shù)定義重載操作符
      3.除了operator()之外,對其他重載操作符提供缺省實(shí)參都是非法的
      4.c++要求,=,[],()和->四個操作符必須被定義為類成員操作符,否則會編譯錯誤
      5.操作符->被重載為一元操作符,即它沒有參數(shù)。比如如下代碼:
      class Aptr{
      public:
          A* operator->(){return ptr;}
      };
      Aptr p;
      那么就可以用p->a;來訪問類A的成員變量a。
      6.operator new()和new表達(dá)式的區(qū)別。
      c++primer上多次提到new操作符和new表達(dá)式。google一下,似乎是這樣的,我們平時寫下的new A();其實(shí)是一個new表達(dá)式,這個表達(dá)式會做兩件事情: 調(diào)用operator new()分配空間;調(diào)用構(gòu)造函數(shù)初始化對象。從這里也可以看出,我們在重載new操作符時只要分配空間即可,無須為其調(diào)用構(gòu)造函數(shù)或者進(jìn)行初始化。同理,operator delete()也只需要釋放空間即可,delete表達(dá)式會先調(diào)用析構(gòu)函數(shù),然后調(diào)用delete操作符。
      7.delete操作符重載的參數(shù)。
      delete操作符重載返回值必須為void,但是參數(shù)可以有兩種形式:(void *)或者(void *, size_t)。如果為后者,則編譯器會自動將第二個參數(shù)設(shè)置為對象大小。經(jīng)過測試,如果兩個形式都提供,delete表達(dá)式似乎會調(diào)用一個參數(shù)的那個。
      實(shí)際上,delete操作符還可以重載為其他形式,參數(shù)表也可以任意,只是第一個參數(shù)必須為void *。而且由delete表達(dá)式調(diào)用的只能是前面兩種形式。雖然不能被delete表達(dá)式隱式調(diào)用,但是重載的delete操作符還是非常有用,因?yàn)樗梢员划惓L幚泶a隱式調(diào)用。有時new操作符分配空間會失敗,這時會拋出一個異常,如何保證new操作符所作的操作被撤銷呢?這種情況下,編譯器會自動尋找與所調(diào)用的new操作符參數(shù)表相同的delete操作符,并且調(diào)用它,注意這里所說的參數(shù)表相同不包括第一個參數(shù),因?yàn)閚ew第一個參數(shù)總是size_t,而delete總是void *。一般來說,如果用戶提供了定位new操作符的重載版本,也應(yīng)該提供同參數(shù)表的delete,以便在分配失敗的時候撤銷所作的操作。
      8.new操作符重載的參數(shù)
      與delete一樣,new操作符也可以有各種參數(shù)表,但是有一個要求是它的第一個參數(shù)必須是size_t類型。與delete不同的是,new操作符的各種形式都可以通過new表達(dá)式隱式調(diào)用,這些參數(shù)可以通過參數(shù)表傳進(jìn)去,例如:
      new(4) A;
      就會調(diào)用void *A::operator new(size_t, int);這個函數(shù)。定位new操作符其實(shí)只是其中的一種特例,就是參數(shù)表如(size_t, void *)類型的new操作符重載
      9.重載new和delete操作符都是靜態(tài)函數(shù)。因?yàn)樗鼈儼l(fā)生在對象構(gòu)造之前和析構(gòu)之后,無法與具體的對象相關(guān)聯(lián)。
      10.類型轉(zhuǎn)換函數(shù) operator type()中type可以是類類型,內(nèi)置類型或typedef類型,但是不能是數(shù)組或函數(shù),且轉(zhuǎn)換函數(shù)必須是類成員函數(shù),它不能帶有任何的參數(shù)和返回值,默認(rèn)參數(shù)也不可以,注意這里沒有返回值不代表不能使用return,應(yīng)該認(rèn)為返回值已經(jīng)被指定,必須是轉(zhuǎn)換的目標(biāo)類型。
      11.調(diào)用operator type() 并不要求目標(biāo)類型于type精確匹配,只要目標(biāo)類型可以通過一系列標(biāo)準(zhǔn)類型轉(zhuǎn)換到達(dá)即可,也就是說,假如我們只為類A聲明了operator int()而沒有operator double(),那么A a; a+3.14會先轉(zhuǎn)換為int類型,然后在通過標(biāo)準(zhǔn)類型轉(zhuǎn)換轉(zhuǎn)換為double類型。還要注意,這里是通過一系列標(biāo)準(zhǔn)轉(zhuǎn)換,在一次自定義轉(zhuǎn)換之后就不會再隱式調(diào)用自定義轉(zhuǎn)換了,希望通過類A隱式轉(zhuǎn)換為B再隱式轉(zhuǎn)換為int的寫法是無法編譯通過的。
      以上條款對于通過構(gòu)造函數(shù)進(jìn)行的類型轉(zhuǎn)換同樣適用。
      12."->"操作符重載沒有參數(shù),返回類型必須是一個類類型指針或者是重載了"->"的一個類的對象,然后會對返回值繼續(xù)調(diào)用->操作符,直到得出最終結(jié)果。例如:
      class D{
      public:
          D():ddd(43){};
          int ddd;
      };
      class C{
      public:
       D d;
       D* operator->(){return &d;}
      };
      class A{
      public:
          C operator->(){return C();}
      };
      對于A的對象a,表達(dá)式a->ddd訪問的是臨時對象C中的成員d的成員ddd,其中調(diào)用了兩次重載的->操作符,還調(diào)用了一次類對象指針的->操作符。

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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多