操作符重載備忘

來源:互聯網
上載者:User

1.有四個操作符不允許重載,它們是:: .* . ?:

2.程式員只能為類類型或枚舉類型的運算元定義重載操作符

3.除了operator()之外,對其他重載操作符提供預設實參都是非法的

4.c++要求,=,[],()和->四個操作符必須被定義為類成員操作符,否則會編譯錯誤

5.操作符->被重載為一元操作符,即它沒有參數。比如如下代碼:
class Aptr{
public:
    A* operator->(){return ptr;}
};
Aptr p;
那麼就可以用p->a;來訪問類A的成員變數a。

6.operator new()和new運算式的區別。
c++primer上多次提到new操作符和new運算式。google一下,似乎是這樣的,我們平時寫下的new A();其實是一個new運算式,這個運算式會做兩件事情: 調用operator new()分配空間;調用建構函式初始化對象。從這裡也可以看出,我們在重載new操作符時只要分配空間即可,無須為其調用建構函式或者進行初始化。同理,operator delete()也只需要釋放空間即可,delete運算式會先調用解構函式,然後調用delete操作符。

 

7.delete操作符重載的參數。
delete操作符重載傳回值必須為void,但是參數可以有兩種形式:(void *)或者(void *, size_t)。如果為後者,則編譯器會自動將第二個參數設定為對象大小。經過測試,如果兩個形式都提供,delete運算式似乎會調用一個參數的那個。
實際上,delete操作符還可以重載為其他形式,參數表也可以任意,只是第一個參數必須為void *。而且由delete運算式調用的只能是前面兩種形式。雖然不能被delete運算式隱式調用,但是重載的delete操作符還是非常有用,因為它可以被異常處理代碼隱式調用。有時new操作符分配空間會失敗,這時會拋出一個異常,如何保證new操作符所作的操作被撤銷呢?這種情況下,編譯器會自動尋找與所調用的new操作符參數表相同的delete操作符,並且調用它,注意這裡所說的參數表相同不包括第一個參數,因為new第一個參數總是size_t,而delete總是void *。一般來說,如果使用者提供了定位new操作符的重載版本,也應該提供同參數表的delete,以便在分配失敗的時候撤銷所作的操作。

 

8.new操作符重載的參數
與delete一樣,new操作符也可以有各種參數表,但是有一個要求是它的第一個參數必須是size_t類型。與delete不同的是,new操作符的各種形式都可以通過new運算式隱式調用,這些參數可以通過參數表傳進去,例如:
new(4) A;
就會調用void *A::operator new(size_t, int);這個函數。定位new操作符其實只是其中的一種特例,就是參數表如(size_t, void *)類型的new操作符重載

 

9.重載new和delete操作符都是靜態函數。因為它們發生在物件建構之前和析構之後,無法與具體的對象相關聯。

10.類型轉換函式 operator type()中type可以是類類型,內建類型或typedef類型,但是不能是數組或函數,且轉換函式必須是類成員函數,它不能帶有任何的參數和傳回值,預設參數也不可以,注意這裡沒有傳回值不代表不能使用return,應該認為傳回值已經被指定,必須是轉換的目標類型。

11.調用operator type() 並不要求目標類型於type精確匹配,只要目標類型可以通過一系列標準類型轉換到達即可,也就是說,假如我們只為類A聲明了operator int()而沒有operator double(),那麼A a; a+3.14會先轉換為int類型,然後在通過標準類型轉換轉換為double類型。還要注意,這裡是通過一系列標準轉換,在一次自訂轉換之後就不會再隱式調用自訂轉換了,希望通過類A隱式轉換為B再隱式轉換為int的寫法是無法編譯通過的。
以上條款對於通過建構函式進行的類型轉換同樣適用。 

12."->"操作符重載沒有參數,傳回型別必須是一個類類型指標或者是重載了"->"的一個類的對象,然後會對傳回值繼續調用->操作符,直到得出最終結果。例如:
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,運算式a->ddd訪問的是臨時對象C中的成員d的成員ddd,其中調用了兩次重載的->操作符,還調用了一次類對象指標的->操作符。

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.