C++強制類型轉換操作符 static_cast


---恢復內容開始---

static_cast是一個強制類型轉換操作符。強制類型轉換,也稱為顯式轉換,C++中強制類型轉換操作符有static_cast、dynamic_cast、const_cast、reinterpert_cast四個。

 

編譯器隱式執行的任何類型轉換都可以由static_cast來完成,比如int與float、double與char、enum與int之間的轉換等。

double a = 1.999;
int b = static_cast<double>(a); //相當於a = b ;

當編譯器隱式執行類型轉換時,大多數的編譯器都會給出一個警告:

e:\vs 2010 projects\static_cast\static_cast\static_cast.cpp(11): warning C4244: “初始化”: 從“double”轉換到“int”,可能丟失數據

  使用static_cast可以明確告訴編譯器,這種損失精度的轉換是在知情的情況下進行的,也可以讓閱讀程序的其他程序員明確你轉換的目的而不是由於疏忽。

  把精度大的類型轉換為精度小的類型,static_cast使用位截斷進行處理。

 

使用static_cast可以找回存放在void*指針中的值。

    double aa = 1.999;
    void * vptr = & aa;
    double * dptr = static_cast<double*>(vptr);
    cout<<*dptr<<endl;//輸出1.999

static_cast也可以用在於基類與派生類指針或引用類型之間的轉換然而它不做運行時的檢查,不如dynamic_cast安全static_cast僅僅是依靠類型轉換語句中提供的信息來進行轉換,而dynamic_cast則會遍歷整個類繼承體系進行類型檢查,因此dynamic_cast在執行效率上比static_cast要差一些。現在我們有父類與其派生類如下:

 

static_cast是一個強制類型轉換操作符。強制類型轉換,也稱為顯式轉換,C++中強制類型轉換操作符有static_cast、dynamic_cast、const_cast、reinterpert_cast四個。

 

編譯器隱式執行的任何類型轉換都可以由static_cast來完成,比如int與float、double與char、enum與int之間的轉換等。

double a = 1.999;
int b = static_cast<double>(a); //相當於a = b ;

當編譯器隱式執行類型轉換時,大多數的編譯器都會給出一個警告:

e:\vs 2010 projects\static_cast\static_cast\static_cast.cpp(11): warning C4244: “初始化”: 從“double”轉換到“int”,可能丟失數據

  使用static_cast可以明確告訴編譯器,這種損失精度的轉換是在知情的情況下進行的,也可以讓閱讀程序的其他程序員明確你轉換的目的而不是由於疏忽。

  把精度大的類型轉換為精度小的類型,static_cast使用位截斷進行處理。

 

使用static_cast可以找回存放在void*指針中的值。

    double aa = 1.999;
    void * vptr = & aa;
    double * dptr = static_cast<double*>(vptr);
    cout<<*dptr<<endl;//輸出1.999

static_cast也可以用在於基類與派生類指針或引用類型之間的轉換然而它不做運行時的檢查,不如dynamic_cast安全static_cast僅僅是依靠類型轉換語句中提供的信息來進行轉換,而dynamic_cast則會遍歷整個類繼承體系進行類型檢查,因此dynamic_cast在執行效率上比static_cast要差一些。現在我們有父類與其派生類如下:

class ANIMAL
{
public:
    ANIMAL():_type("ANIMAL"){}
    virtual void OutPutname(){cout<<"ANIMAL" << endl;}
private:
    string _type ;
};
class DOG:public ANIMAL
{
public:
    DOG():_name("dahuang"),_type("DOG"){}
    void OutPutname(){cout<<_name << endl;}
    void OutPuttype(){cout<<_type << endl;}
private:
    string _name ;
    string _type ;
};

此時我們進行派生類與基類類型指針的轉換:注意從下向上的轉換是安全的,從上向下的轉換不一定安全

int main()
{
    //基類指針轉為派生類指針,且該基類指針指向基類對象。
    ANIMAL * ani1 = new ANIMAL ;
    DOG * dog1 = static_cast<DOG*>(ani1);
    //基類指針轉為派生類指針,且該基類指針指向派生類對象
    ANIMAL * ani3 = new DOG;
    DOG* dog3 = static_cast<DOG*>(ani3);
    dog3->OutPutname(); //正確

    //子類指針轉為派生類指針
    DOG *dog2= new DOG;
    ANIMAL *ani2 = static_cast<DOG*>(dog2);
    ani2->OutPutname(); //正確,結果輸出為大黃

    //
    system("pause");

}

static_cast可以把任何類型的表達式轉換成void類型。

另外,與const_cast相比,static_cast不能把換掉變量的const屬性,也包括volitale或者__unaligned屬性。

 

參考:https://www.cnblogs.com/QG-whz/p/4509710.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM