2016年11月24日 星期四

四種型態轉換

http://windsplife.blogspot.tw/2010/09/cstaticcast-dynamiccast-reinterpretcast.html
http://ot-note.logdown.com/posts/173174/note-cpp-named-type-convertion

有四種static_cast,dynamic_cast,reinterpret_cast,const_cast

其實網頁上寫的應該都是很詳細了
所以這裡我只是就我認知寫一下,

Static_cast<T>exp是靜態轉換
它等同於(T)exp

直接舉例好了
int a = 5;
double b = (int)a; or
double b = static_cast<int>(a);


總之主要就是算術轉型

一般用這個大部分都是用來做算術轉型

雖然他也可以用來轉型指標,但是不保證安全,尤其在多重繼承的情況下,幾乎是很容易出錯,也就是失敗

而主要指標一般有需要用來轉型,一般是在一般的變數結構裡

例如一個一維陣列
char* rrr = new char[100 * 3];
就是一個一維陣列存RGB存100筆
一般我們可以宣告一個結構去接他

Struct aaa
{
       Char r;
       Char g;
       Char b;
};

Aaa* temp = (aaa*)rrr;


這樣只要temp[xx].r,就可以很明瞭的作存取值的動作

一般做繼承的class的指標轉換會用dynamic_cast去轉,但是網頁上有說dynamic_cast轉class,class內必須有virtual function才會成功

總之要是有多層結構,記得用dynamic_cast去轉換,轉失敗他會回傳NULL,

雖然說dynamic_cast需要做一些檢查,但是其實在繼承的架構底下,指標轉來轉去,沒用這個基本上會莫名其妙的錯誤,所以有時候還是要乖乖地做轉換


剩餘兩個其實比較不常用
reinterpret_cast就是強制轉換,反正轉換完他就用新的類型的bit結構去處理

例如:

int* i;
char* str = "test";
i = reinterpret_cast<int*>(str);

您會發現*i讀出會是134514704


總之就是強制bit轉換,轉換後直接把原來的bit樣子用轉換後的類型去解讀

至於const_cast其實我也不常用,總之網頁上是將const類型轉換為一般類型,通常會用const都是為了做保護,把他轉換為可讀寫的,一般容易亂,建議少用

沒有留言:

張貼留言