析構函數的小祕密

對於析構函數,每個人都非常熟悉,以至於遺忘了她一些與衆不同的地方,其實,析構函數偶爾也會爆發個性的喲,不相信的話,請看下面的代碼。

 

send.CRC = ~TCRC32().Check(&send,sizeof(TMyStatusPkg)-4);

 

這是水木上的一個帖子,作者不知這是什麼語法。其中TCRC32是一個類。

 

乍一看很多和帖子作者一樣的人都會迷惑(包括我在內):析構函數怎會有返回值呢?

 

實際上如果加個括號,看起來就更方便一些:

 

send.CRC = ~( TCRC32().Check(&send,sizeof(TMyStatusPkg)-4)) ;

 

現在明白了,這句話是調用構造函數,再調用其成員,返回一個整數,並按位取反

 

現在看看說明書(ISO14882 2003 12.4.13):

[Note: an explicit destructor call must always be written using a member access operator
(5.2.5); in particular, the unary-expression ~X() in a member function is not an explicit destructor call
(5.3.1).

也就是說必須用.和->來訪問,單獨的~X則被當做一個一元表達式。

 

原來是這樣啊,弄明白了一個問題,今天真是充實的一天。

 

如果看一下記載這條知識的那一頁的最後一段話,還會讓您回想起另外一個一個有趣的事實,對內置類型一樣可以調用顯式析構函數:

typedef int I;
I* p;
// ...
p->I::˜I();

 

這是爲了模板。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章