天天看點

C/C++進階[4]

Point   6   位運算       我們都很清楚,位運算涉及到資料的二進制表示,以及資料的大小或者說長度。在進行位移操作的時候我們不得不關注變量的長度,因為一般的位移操作(>>或<<)并不是循環位移,有移出資料位的可能,除非我們期望得到那種結果。考慮下面例子:       int    x = 1;     x >>= 1; x = ? 結果x = 0。其它的<<,^,~等位運算具體細節請參考《The C Programming Language》或者資料的補碼表示。下面我主要介紹與類型定義有關的位運算。 考慮下面的例子: typedef   unsigned int    FIND_T; #define   FIND_ARG_NO_ATTR                  0x0000 #define   FIND_ARG_PATH                          0x0001 #define   FIND_ARG_TYPE                         0x0002 #define   FIND_ARG_PATH_TYPE                     0x0003 #define   FIND_ARG_FILENAME               0x0004 #define   FIND_ARG_PATH_FILENAME           0x0005 #define   FIND_ARG_FILENAME_TYPE           0x0006 #define   FIND_ARG_ALL                            0x0007 #define   FIND_ARG_BAD                           0x0008 這些宏定義為查找操作的屬性參數。正如你所看到的, FIND_ARG_PATH 定義為十六進制數 0x0001 ,它代表以路徑方式查找。同樣定義 FIND_ARG_TYPE ,當需要 FIND_ARG_PATH_TYPE 屬性的時候,可以直接使用該宏,或者使用 FIND_ARG_PATH | FIND_ARG_TYPE 的組合,顯然這兩種方式的結果( 0x0003 )是一樣的。這樣用的好處在于我們能從基本的屬性組合出複雜的屬性,也友善從複雜的屬性中提取基本屬性。看下面例子: FIND_T        find = FIND_ARG_PATH_TYPE; if ( find & FIND_ARG_PATH ) {        //if statement, deal with path }        這種應用要求從 BCD 二進制到十六進制或十進制的考慮。在設計這種類型宏的時候盡量從 BCD 二進制開始,然後轉換為十六進制或十進制,以期得到較合理的結果。 Point   7    虛成員函數       考慮下面的例子: class CSA :     public Counter,     public LIB,     public CmdParser,     public Help {     void Print(PITEM pItm) const; //basic interfaces and data of class CSA };            class LIB               {     virtual void Print(PITEM pItm) const; // basic interfaces and data of class LIB               }       類CSA繼承了類LIB。假如有一函數: void CSA::Fun() {        This->Print(pItm);        //body of Fun } 結果将得到一個警告。因為編譯器搞不清楚到底調用的是哪個 Print() 。 指出函數的域會好些: LIB::Print(pItm) 。

繼續閱讀