C++提供了四個轉換運算符

  • const_cast <new_type> (expression)
  • static_cast <new_type> (expression)
  • reinterpret_cast <new_type> (expression)
  • dynamic_cast <new_type> (expression)

它們有着相同的結構,看起來像是模板方法。這些方法就是提供給開發者用來進行指針和引用的轉換的。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屬性。

相關文章
相關標籤/搜索