型別轉換有兩種,一種是隱式型別轉換另一種時顯示型別轉換。
一般隱式型別轉換發生在以下幾種情況
c++中的顯式型別轉換比較比較危險,使用時應該極為小心。
強制型別轉換具有如下形式:
cast-name(expression)
type是要轉換的目標型別,expression是要轉換的表示式,cast_name是static_cast、dynamic_cast、const_cast、和reinterpret_cast中的一種。
任何具有明確定義的型別轉換,只要不包含底層const都可以使用static_cast。一般用於將較大的的型別數轉換為較小型別的數以及將存放於void*中的值裝換為原來的值等。
double a=static_cast<
double
>(10
)/3;
//將整數轉換為浮點數
int d=9;
void
*p=&d;
int*p1=static_cast<
int*
>p;
//將void*型別轉換為int型別
當把void*中的資料轉換成為原有型別時,原有的型別一定不能用錯,否則將會發生未定義錯誤。
const_cast運算用於改變運算的底層const
const
char
*pc;
char
*p=cnost_cast<
char
*>
(pc)
;
編譯能通過,但是當通過p來寫值時將會發生未定義錯誤。如果乙個物件本身是乙個常量,我們通過const_cast來強制轉換並修改其值時將會產生錯誤,如果乙個數不是常量,我們通過const_cast來回的寫許可權是可以的。
const主要用於將cast屬性轉換掉,但是我們又不能對轉換後的進行寫操作,const_cast有什麼用?
const_cast可以用於引數的傳遞。
void
fun(
const
int*a)
//上述函式的以下呼叫;
int a=10;
fun(&10
);//錯誤,const int *形參和int*形參不相容;
fun(
const
<
int*
>
(&a));
//正確,可以呼叫
過載函式中使用const_cast:
const string&
shorter
(const string& s1,
const string& s2)
乙個比較字串大小的函式,其引數和返回值均為const string ,如果我們傳入兩個非常量的字串的引用,我們的希望他返回的是&string,那麼我們的可以按照以下的思路進行函式過載。先把傳入的普通的字串轉換成為const string &,然後在呼叫未過載的函式,得到乙個const string &,然後將該const string&強制轉換成為&string後返回。
string&
shorter
(string& s1, string& s2)
reinterpret_cast本質上是依賴於機器的,想要安全的使用reinterpret_cast需要對型別和編譯都很了解。這相當於是c語言中的指標強制型別裝換。
例子:
int
*ip;
char
*pc=reinterpret_cast<
char
*>
(ip)
;//上述轉換等價於
char
*pc=
(char
*) ip;
dynamic_cast一般用於繼承類和基類之間進行轉換,一般是將基類的指標或者引用轉化成繼承類的指標或者引用,但是基類中必須含有虛函式,並用轉換後的指標呼叫非虛函式,dynamic_cast能夠判斷轉換是否成功。
指標轉換
假設基類base中有虛函式,將基類inherited指標轉換成繼承類的指標如下:
base *ba;
//ba為基類指標
if(inherited *in=dynamic_cast>
(ba)
)//轉換成功
else
上述語句的轉換時安全的,且*in僅在if作用域內有效。
引用轉換
引用型別和指標的轉換在表達錯誤的方式上不同,因為引用型別沒有空引用,所以不能用指標的方式判斷。我們將用try-catch的來判斷轉換是否成功,當引用型別的轉換失敗時,程式將會丟擲乙個名為std::bad_cast的異常,定義在標頭檔案typeinfo中。
voidf(
const base &ba)
catch
(bad_cast)
}
C 顯示型別轉換
首先說明,該內容主要摘自c stl 開發技術導引。在c語言中,我們一般採用隱式型別轉換,這樣導致的結果是可讀性不高。如下這段 這段 將double型別轉換成了int型別,問題是如果別人來看這段 的時候,別人可能就不知道這種轉換是程式需要的還是編寫 的人不小心寫錯了呢。因此,在c 程式中應盡量使用顯示...
c 顯示型別轉換
dynamic cast,static cast,const cast,1.使用dynamic cast 操作符將基類型別物件的引用或者指標轉換為同一繼承層次中其他型別的引用或者指標 執行時型別檢查 2.const cast 操作符將變數的const性質轉換掉 example1 double d 8...
c 顯示型別轉換
c 引入了4個新的強制型別轉換操作符,static cast dynamic cast const cast reinterpret cast,用以支援更為精細的型別轉換。這些操作符取代了以往小圓括號所代表的舊式轉型,能夠清楚闡明轉型的目的。這些新式轉型操作符給了編譯器更多資訊,讓編譯器清楚知道轉型...