它們有着相同的結構,看起來像是模板方法。這些方法就是提供給開發者用來進行指針和引用的轉換的。ios
一、const_cast用法express
const_cast是一種C++運算符,主要是用來去除複合類型中const和volatile屬性(沒有真正去除)。安全
變量自己的const屬性是不能去除的,要想修改變量的值,通常是去除指針(或引用)的const屬性,再進行間接修改。函數
用法:const_cast<type>(expression)優化
經過const_cast運算符,也只能將const type*轉換爲type*,將const type&轉換爲type&。spa
也就是說源類型和目標類型除了const屬性不一樣,其餘地方徹底相同。指針
#include<iostream> using namespace std; void ConstTest1(){ const int a = 5; int *p; p = const_cast<int*>(&a); (*p)++; cout<<a<<endl; cout<<*p<<endl; } void ConstTest2(){ int i; cout<<"please input a integer:"; cin>>i; const int a = i; int &r = const_cast<int &>(a); r++; cout<<a<<endl; } int main(){ ConstTest1(); ConstTest2(); return 0; } 輸出: 5 6 若輸入7 則輸出8
解釋爲何輸出8:code
當常變量爲 const int j =i 時,直接輸出j時,編譯器不能進行優化,也就是不可以直接用i代替j;(r是a的引用,r變,a會變)對象
當常變量爲const int j =5時,直接輸出j時,編譯器會進行優化,也就是用文字常量5直接代替j;blog
2) static_cast
用法:static_cast <typeid> (expression)
說明:該運算符把expression轉換爲typeid類型,但沒有運行時類型檢查來確保轉換的安全性。
用途:
a) 用於類層次結構中基類和派生類之間指針或者引用的轉換。up-casting (把派生類的指針或引用轉換成基類的指針或者引用表示)是安全的;down-casting(把基類指針或引用轉換成子類的指針或者引用)是不安全的。
b) 用於基本數據類型之間的轉換,如把int轉換成char,這種轉換的安全性也要由開發人員來保證。
c) 能夠把空指針轉換成目標類型的空指針(null pointer)。
d) 把任何類型的表達式轉換成void類型。
注意: static_cast不能轉換掉expression的const、volitale或者__unaligned屬性。
class A { public: virtual void a() { cout << 'a' << endl; } virtual void b() { cout << 'a' << endl; } private: int i; }; class B:public A { public: virtual void a() { cout << 'b' << endl; } }; int main(void) { A *pa = new A(); B *pb = static_cast<B*>(pa); B *ppb = new B(); A *ppa = static_cast<A*>(ppb); return 0; }
3) reinterpret_cast
用法:reinterpret_cast <typeid>(expression)
說明:轉換一個指針爲其餘類型的指針,也容許將一個指針轉換爲整數類型,反之亦然。這個操做符可以在非相關的類型之間進行轉換。操做結果只是簡單的從一個指針到別的指針的值的二進制拷貝,在類型之間指向的內容不作任何類型的檢查和轉換。這是一個強制轉換。使用時有很大的風險,慎用之。
注意:reinterpret _cast不能轉換掉expression的const、volitale或者__unaligned屬性。
4)dynamic_cast
用法:dynamic_cast <typeid> (expression)
說明:該運算符把expression轉換成typeid類型的對象。typeid必須是類的指針、類的引用或者void*。若是typeid是類的指針類型,那麼expression也必須是指針,若是typeid是一個引用,那麼expression也必須是一個引用。通常狀況下,dynamic_cast用於具備多態性的類(即有虛函數的類)的類型轉換。
dynamic_cast依賴於RTTI信息,其次,在轉換時,dynamic_cast會檢查轉換的source對象是否真的能夠轉換成target類型,這種檢查不是語法上的,而是真實狀況的檢查。先看RTTI相關部分,一般,許多編譯器都是經過vtable找到對象的RTTI信息的,這也就意味着,若是基類沒有虛方法,也就沒法判斷一個基類指針變量所指對象的真實類型,這時候,dynamic_cast只能用來作安全的轉換,例如從派生類指針轉換成基類指針。而這種轉換其實並不須要dynamic_cast參與。也就是說,dynamic_cast是根據RTTI記載的信息來判斷類型轉換是否合法的。
用途:主要用於類層次之間的up-casting和down-casting,還能夠用於類之間的交叉轉換。在進行down-casting時,dynamic_cast具備類型檢查的功能,比static_cast更安全。檢測在運行時進行。若是被轉換的指針不是一個被請求的有效完整的對象指針,返回值爲NULL。當用於多態類型時,它容許任意的隱式類型轉換以及相反過程。不過,與static_cast不一樣,在後一種狀況裏(注:即隱式轉 換的相反過程),dynamic_cast會檢查操做是否有效。也就是說,它會檢查轉換是否會返回一個被請求的有效的完整對象。
注意:dynamic_cast不能轉換掉expression的const、volitale或者__unaligned屬性。