對於析構函數,每個人都非常熟悉,以至於遺忘了她一些與衆不同的地方,其實,析構函數偶爾也會爆發個性的喲,不相信的話,請看下面的代碼。
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();
這是爲了模板。