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)用了一次類對象指針的->操作符。
|
|