天天看點

C++ casts那些事兒

c++ casts那些事兒

c/c++編譯器類型隐式轉換我想大家都一定很熟悉了。寫c++的程式,要麼是依靠編譯器進行類型隐式轉換,要麼自己顯示将類型進行轉換,但是很少用到cast。最近看到一些代碼經常使用cast來進行顯示轉換。自己研究下,發現cast這東西還是很有意思。

c++中cast關鍵字有:static_cast, dynamic_cast, const_cast, reinterpret_cast四種

cast的文法:

cast-name<type>(expressiong)

後面的expression不管是一個變量還是一個表達式,都需要使用括号。

const_cast:

将const變量轉換成非const變量

#include <iostream>

using namespace std;

void func(char *str){

/...

}

int main(){

const char *mystr = "hello tan haiyan";

func(mystr);

上面這段代碼肯定會編譯報錯。無法将const char * 轉換成char *

這個時候const_cast就可以起到作用了:

作出以下更改之後,就沒問題了。

func(const_cast<char *>(mystr));

隻有const_cast才具有将const轉換成非const類型

static_cast:

顯示類型轉換。這種cast的主要目的是讓程式員和編譯器知道這段代碼作出的轉換就是我想要的結果而不是失誤或者偶然,這樣可以去掉編譯器誤認為是因為程式員操作失誤而産生的類型轉換的警告。

double d_data = 3.14;

int i_data = static_cast<int>(d_data);//這樣顯示轉換,編譯器不會有警告

double d_data = 3.14

void *ptr = &d_data

/**

如果我們已經知道void 指針指向的是一個double資料。我們就可以作出這種強制轉換*/

double *ptmp_data = static_const<double *>(ptr);

reinterpreter_cast:

reinterpreter_cast比較不好了解。它隻進行一種簡單的bit位複制而不進行二進制資料分析。

這種盲目的複制而不進行資料分析的強制轉換在使用過程中一定要謹慎。

僅僅是簡單的複制了n的bit位到變量d,不進行任何資料分析

*/

int n=9;   

double d=reinterpret_cast<double & > (n);

dynamic_cast:

除了轉換之外,多了一步安全檢查,檢查轉換是否可行。依賴于rtti

struct a {

virtual void f() { }

};

struct b : public a { };

struct c { };

void f () {

a a;

b b;

a* ap = &b;

b* b1 = dynamic_cast<b*> (&a); // null, because 'a' is not a 'b'

b* b2 = dynamic_cast<b*> (ap); // 'b'

c* c = dynamic_cast<c*> (ap); // null.

a& ar = dynamic_cast<a&> (*ap); // ok.

b& br = dynamic_cast<b&> (*ap); // ok.

c& cr = dynamic_cast<c&> (*ap); // std::bad_cast

版權申明:

轉載文章請注明原文出處http://blog.csdn.net/feiyinzilgd/archive/2010/12/30/6108417.aspx

并請聯系譚海燕

本人或者前往譚海燕個人首頁

留言

繼續閱讀