閱讀549 返回首頁    go 技術社區[雲棲]


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就可以起到作用了:

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

#include <iostream> using namespace std; void func(char *str){ /... } int main(){ const char *mystr = "hello tan haiyan"; 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 }

 

 

 

 


版權申明:
轉載文章請注明原文出處https://blog.csdn.net/feiyinzilgd/archive/2010/12/30/6108417.aspx
並請聯係譚海燕 本人或者前往譚海燕個人主頁 留言

最後更新:2017-04-02 06:51:33

  上一篇:go 03.獲取和設置元素特性的值
  下一篇:go C#.NET將數組導入Excel源代碼