天天看點

C++标準轉換運算符static_cast

雖然const_cast是用來去除變量的const限定,但是static_cast卻不是用來去除變量的static引用。其實這是很容易了解的,static決定的是一個變量的作用域和生命周期,比如:在一個檔案中将變量定義為static,則說明這個變量隻能在本Package中使用;在方法中定義一個static變量,該變量在程式開始存在直到程式結束;類中定義一個static成員,該成員随類的第一個對象出現時出現,并且可以被該類的所有對象所使用。

對static限定的改變必然會造成範圍性的影響,而const限定的隻是變量或對象自身。但無論是哪一個限定,它們都是在變量一出生(完成編譯的時候)就決定了變量的特性,是以實際上都是不容許改變的。這點在const_cast那部分就已經有展現出來。

static_cast和reinterpret_cast一樣,在面對const的時候都無能為力:兩者都不能去除const限定。兩者也存在的很多的不同,比如static_cast不僅可以用在指針和引用上,還可以用在基礎資料和對象上;前面提到過reinterpret_cast可以用在"沒有關系"的類型之間,而用static_cast來處理的轉換就需要兩者具有"一定的關系"了。

還是用例子來說明比較直覺一些。

而以上轉換,都是static_cast所不能完成的任務,也就是說把上邊程式裡所有的reinterpret_cast換成static_cast的話,就會立即得到編譯錯誤,因為目标指針和原始指針之間不存在"關系"

從上邊的程式,也就一下子看出來了reinterpret_cast和static_cast之間最本質的差別。

對于static_cast所需要的關系,"繼承"絕對是其中之一,是以static_cast支援指向基類的指針和指向子類的指針之間的互相轉換:

但是從基類到子類的轉換,用static_cast并不是安全的,具體的問題會在dynamic_cast一篇闡述。

在指針和引用友善,似乎也隻有繼承關系是可以被static_cast接受的,其他情況的指針和引用轉換都會被static_cast直接扔出編譯錯誤,而這層關系上的轉換又幾乎都可以被dynamic_cast所代替。這樣看起來static_cast運算符的作用就太小了。

實際上static_cast真正用處并不在指針和引用上,而在基礎類型和對象的轉換上 。 而基于基礎類型和對象的轉換都是其他三個轉換運算符所辦不到的。

基礎類型轉換:

<code>float floatValue = 21.7; int intValue = 7; cout &lt;&lt; floatValue / 7 &lt;&lt; "\t\t" &lt;&lt; static_cast&lt;int&gt; (floatValue)/7 &lt;&lt;endl; cout &lt;&lt; intValue/3 &lt;&lt; "\t\t" &lt;&lt; static_cast&lt;double&gt; (intValue)/3 &lt;&lt; endl; //Output: //3.1     3 //2       2.33333</code>

從輸出結果可以看出轉換是成功并且正确的。

對于對象的轉換,也是需要又關系的,這層關系就是C++使用者自定義類型轉換中提到的方法:

構造函數(Constructor)

類型轉換運算符(Type –Cast Operator

static_cast會根據上述順序尋找到合适的方法進行類型轉換。

指派運算符并不被算在内,因為它自身已經是一種運算符,不能再當做轉換運算符來用。

<a href="http://www.cplusplus.com/doc/tutorial/typecasting/">C++ Language Tutorial - Type Casting</a>

<a href="http://www.ecs.syr.edu/faculty/fawcett/handouts/webpages/CSE687.htm">Object Oriented Design</a>

<a href="http://publib.boulder.ibm.com/infocenter/compbgpl/v9v111/index.jsp?topic=/com.ibm.xlcpp9.bg.doc/language_ref/keyword_static_cast.htm">IBM Complilers - XL C/C++ V9.0 for Linux - The static_cast operator (C++ only)</a>

<a href="http://www2.research.att.com/~bs/bs_faq2.html#static-cast">Bjarne Stroustrup's C++ Style and Technique FAQ - What good is static_cast?</a>

繼續閱讀