C 中的強制型別轉換

2021-08-13 10:25:04 字數 2093 閱讀 2873

只要不包含底層const,都可以使用

/*

static_cast(exp) 將exp的結果轉化為type型別

*/double d = 10;

void *vp = &d;

double *dp = static_cast

(vp);

cout

<< *dp << endl;

如果轉換的型別不符,將會產生ub,且沒有編譯錯誤

只能用於改變(新增或去掉)運算物件的底層const

//新增乙個底層const

int val=10,*p=&val;

const

int *cp = const_cast

int*>(p);

//cp是底層const指標(即使不這麼寫,也會完成隱式轉換)

const_cast的實際用途其實 在於去掉乙個底層const

會有這樣一種情況,本來不具有底層const的指標或引用,在傳值的過程中被隱身轉換為底層const,這時可以用const_cast去掉底層const

int val = 10;

const

int *cp = &val; //cp雖然有底層const,但它所指的不是常量

int *pp = const_cast

(cp); //去掉底層const後,可以通過pp改變val的值

/*乙個錯誤的例子*/

const

int cval = 10; //cp所指的cval本就是不許改變的常量

const

int *cp = &cval;

int *pp = const_cast

(cp); //即使去掉了底層cosnt,通過pp對cval改值是ub

reinterpret_cast通常為運算物件的位模式提供較低層次上的重新解釋。舉個例子,假設有如下的轉換:

int *ip;

char *pc = reinterpret_cast

(ip);

我們必須牢記pc所指的真實物件是int而非字元,如果把pc當成乙個普通的字元指標使用就可能在執行時發生錯誤。例如:

string str(po);
可能導致異常的執行時行為。

使用reinterpret_cast是非常危險的,用pc初始化的例子很好地證明了這一點。其中的關鍵問題是型別改變了,但編譯器沒有給出任何警告或者錯誤的提示資訊。當我們用乙個int的位址初始化pc時,由於顯式地聲稱這種轉換合法,所以編譯器不會發出任何警告或錯誤資訊。接下來再使用pc時就會認定它的值是char*型別,編譯器沒法知道它實際存放的是指向int的指標。

reinterpret_cast有何作用?

只用於物件的指標和引用.

當用於多型型別時,它允許任意的隱式型別轉換以及相 反過程. 

不過,與static_cast不同,在後一種情況裡(注:即隱式轉換的相反過程),dynamic_cast 會檢查操作是否有效. 也就是說, 它會檢查轉換是否會返回乙個被請求的有效的完整物件。檢測在執行時進行. 如果被轉換的指標不是乙個被請求的有效完整的物件指標,返回值為null. 對於引用 型別,會丟擲bad_cast異常 .

type(expr)      //函式形式的強制型別轉換

(type)expr //c語言風格的強制型別轉換

舊式的強制型別轉換從表現形式上來說不那麼清晰,容易看漏,而且一旦轉換出現問題,追蹤起來也很困難。

C 中型別強制轉換

c 中有4種強制轉換 const cast,static cast,dynamic cast,reinterpret cast,以下將分別介紹 1.const cast 形式const cast expression 用來修改型別的const或volatile屬性,除了const或volatile修...

C 中的強制型別轉換

關於強制型別轉換的問題,很多書都討論過,寫的最詳細的是c 之父的 c 的設計和演化 最好的解決方法就是不要使用c風格的強制型別轉換,而是使用標準c 的型別轉換符 static cast,dynamic cast。標準c 中有四個型別轉換符 static cast dynamic cast reint...

C 中的型別強制轉換

c 同時提供了四種新的強制轉型形式 通常稱為新風格的或 c 風格的強制轉型 const cast expression dynamic cast expression reinterpret cast expression static cast expression 每一種適用於特定的目的 dyn...