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