一、dynamic_cast
使用dynamic_cast
乙個繼承層次內進行轉化的指標/引用。dynamic_cast依賴於rtti資訊,在轉換時,dynamic_cast會檢查轉換的source物件是否真的可以轉換成target型別,這種檢查不是語法上的,而是真實情況的檢查。被轉換的型別必須是多型(即有虛函式)。使用這個會影響執行效率,一般情況下也是不使用的。能在編譯時解決掉的問題沒必要留到執行時、能用多型搞定的事情也沒必要使用 dynamic_cast 和 typeid 等。
classb
;
classd:publicb
;
void
func(b* pb)
在上面的**段中,如果 pb 指向乙個 d 型別的物件,pd1 和 pd2 是一樣的,並且對這兩個指標執行 d 型別的任何操作都是安全的;但是,如果 pb 指向的是乙個 b 型別的物件,那麼 pd1 將是乙個指向該物件的指標,對它進行 d 型別的操作將是不安全的(如訪問 m_szname),而 pd2 將是乙個空指標。
另外要注意:b 要有虛函式,否則會編譯出錯;static_cast則沒有這個限制。
二、static_cast
使用static_cast
普通型別轉換。
①用於類層次結構中基類(父類)和派生類(子類)之間指標或引用的轉換。
進行上行轉換(把派生類的指標或引用轉換成基類表示)是安全的;
進行下行轉換(把基類指標或引用轉換成派生類表示)時,由於沒有動態型別檢查,所以是不安全的。
②用於基本資料型別之間的轉換,如把int轉換成char,把int轉換成enum。這種轉換的安全性也要開發人員來保證。這種不加static_cast進行轉換,一般編譯器會提示告警,加static_cast可以消除告警提示。
③把空指標轉換成目標型別的空指標。
④把任何型別的表示式轉換成void型別。
三、reinterpret_cast
使用reinterpret_cast
的位模式的低級別重讀。使用時要格外小心。reinterpret_cast與編譯器平台相關,因此不具有移植性,使用範圍也有限。
四、const_cast
使用const_cast
鑄造遠const/volatile
。除非你使用const不正確的api,否則請避免這種情況。一般就是別人的庫api裡,但我們要傳入的引數是const型別,而庫的api要的引數沒要求const,這裡編譯器就會報錯,並且我們知道庫api那個函式不會修改我們代入的引數,這裡就可以用const_cast來處理,避免編譯器編譯不過。
五、typeid 列印物件名稱
basea* pa;
basea basea;
pa = &basea;
cout << 「basea」 << " " << typeid(basea).name() << endl;
cout << 「pa」 << " " << typeid(pa).name() << endl;
六、typeof
typeof()關鍵字常見用法一共有以下幾種。
不用知道函式返回什麼型別,可以使用typeof()定義乙個用於接收該函式返回值的變數
typeof(fun()) r1;//定義乙個變數r1,用於接收函式fun()返回的值,假如我們不知道fun()返回型別也可以這樣用
2.在巨集定義中動態獲取相關結構體成員的型別
#define swap(x,y) \
{ typeof(x) temp; \ -->根據型別定義乙個臨時變數temp
temp = x;\
x = y;\
y = temp;\
3. 做型別轉換時的物件型別宣告
const protocol_format::spackethead * phead = (typeof(phead)) rpackrecv.getheaddata();
參考:
關鍵字 一些關鍵字用法總結
register 用register宣告的變數稱暫存器變數,在可能的情況下會直接存放在機器的暫存器中 但對32位編譯器不起作用,當global optimizations 全域性優化 開的時候,它會做出選擇是否放在自己的暫存器中 不過其它與register關鍵字有關的其它符號都對32位編譯器有效。c...
MySql一些關鍵字
使用distinct關鍵字,只返回不同的值 distinct關鍵字,它必須直接放在列名的前面 eg select distinct id from stu 注意 不能部分使用distinct distinct關鍵字應用於所有列而不僅是前置它的列。如果給出select distinct id,name...
python一些常用關鍵字(一)
1 break 終止當前迴圈 2 contime 跳過本次迴圈 3 pass 忽略4 函式名.doc 檢視函式幫助文件 5 global 設定全域性變數 6 nonlocal 不是區域性變數,往上一層找 7 lambda 簡潔的函式表示式 方式1.宣告乙個簡單的lambda表示式 mylamb la...