c++中有4個型別轉換運算子,使裝換過程更規範
dynamic_cast
< type-name> (expression)
如果轉型失敗則返回0,即空指標。
該運算子的用途是,使得能夠在類層次結構中進行向上轉換(由於 is-a關係,這樣的型別轉換時安全的),而不允許其他轉換。
二、const_cast
const_cast運算子用於執行只有一種用途的型別轉換,即改變值為const 或 volatile,其語法與dynamic_cast運算子相同。
const_cast
< type-name > (expression)
如果型別的其他方面也被修改,則上述型別轉換將出錯。也就是說,除了const或volatile特徵(有或無)可以不同外,type_name 和expression的型別必須相同
另外const_cast不是萬能的。它可以修改指向乙個值的指標,但修改const值的結果是不確定的。
using
std::cout;
using
std::endl;
void change(const
int *pt, int n);
int main()
void change(const
int *pt, int n)
執行結果:
pop1,pop2: 38383 , 2000
pop1, pop2: 38280 , 2000
請按任意鍵繼續. . .
可以看到呼叫change()時,修改了pop1,但沒有修改pop2。咋change()中,指正被宣告為const int * ,因此不能用來修改指向的 int 。指標pc刪除了 const特性,因此可用來修改指向的值,但僅當執行的值不少const時才行,因此,pc可用來修改pop1,單不能修改pop2.
三、static_cast
static_cast運算子的語法與其他型別轉換運算子相同
static_cast
< type-name > (expression)
僅當 type-name可被隱式轉換為expression所屬型別或expression可被隱式轉換為type-name所屬的型別時,上述轉換才是合法的,否則將出錯。
high bar;
low blow;
...high *pb = static_cast
( &blow) //合法
low *pl = static_cast
< low *> (&bar) //合法
pond *pmer = static_cast
< pond * > (& blow) ;//非法
四、reinterpret_cast
reinterpret_cast運算子用於天生危險的型別轉換。
用法:
reinterpret_cast
< type-name >(expression)
示例:
struct dat ;
long value = 0xa224b118;
dat * pd = reinterpret_cast
(&value);
cout
然而,reinterpret_cast運算子並不支援所有的型別轉換。例如,可以將指標型別轉換為足以儲存指標表示的整形,但不能將指標轉換為更小的整型或浮點型。另乙個限制是,不能將函式指標轉換為資料指標,反之亦然。 C 型別轉換運算子
隱式轉換,是針對不同型別之間的賦值和運算,函式呼叫傳遞引數 這些的轉換都是由編譯器自動完成 char ch int i ch 顯式轉換 由程式設計師在變數前面新增型轉換 char pc char pb void ps void pa 通過上述的兩種方式,c語言大部分的型別轉換都可以順利進行,c 繼承...
C 型別轉換運算子
用於 指向派生類物件的 基類指標轉換成派生類指標。如果轉換失敗,則返回0,即空指標。通過判斷轉換是否成功,來決定是否用派生類裡的函式 基類中可能沒有那個函式 class a class b public a class c public b a a new a a b new b a c new c...
C 型別轉換運算子
目錄 dynamic cast static cast const cast reinterpret cast c語言的型別轉換比較自由,但也帶來了一些問題,這些問題大多由程式設計師自行控制和解決。對於龐大的c 語言機制而言,這種簡單粗暴的型別轉換方式顯然是個巨大的負擔,因此c 引入4種型別轉換運算...