c++中四種型別轉換運算子的使用方法
reinterpret_cast
該函式將
乙個型別的指標
轉換為另乙個型別的指標
. 這種轉換不用修改指標變數值存放格式(不改變指標變數值),只需在編譯時重新解釋指標的型別就可做到.
reinterpret_cast 可以將指標值轉換為乙個整型數,但
不能用於非指標型別的轉換
. 例:
//基本型別指標的型別轉換
double d=9.2;
double* pd = &d;
int *pi = reinterpret_cast(pd); //相當於int *pi = (int*)pd;
//不相關的類的指標的型別轉換
class a{};
class b{};
a* pa = new a;
b* pb = reinterpret_cast(pa); //相當於b* pb = (b*)pa;
//指標轉換為整數
long l = reinterpret_cast(pi); //相當於long l = (long)pi;
const_cast
該函式用於
去除指標變數的常量屬性
,將它轉換為乙個對應指標型別的普通變數。反過來,也可以將乙個非常量的指標變數轉換為乙個常指標變數。
這種轉換是在編譯期間做出的型別更改。
例: const int* pci = 0;
int* pk = const_cast(pci); //相當於int* pk = (int*)pci;
const a* pca = new a;
a* pa = const_cast(pca); //相當於a* pa = (a*)pca;
出於安全性考慮,const_cast無法將非指標的常量轉換為普通變數。
static_cast
該函式主要用於
基本型別之間
和具有繼承關係的型別
之間的轉換。
這種轉換一般會更改變數的內部表示方式,因此,static_cast應用於指標型別轉換沒有太大意義。
例: //基本型別轉換
int i=0;
double d = static_cast(i); //相當於 double d = (double)i;
//轉換繼承類的物件為基類物件
class base{};
class derived : public base{};
derived d;
base b = static_cast(d); //相當於 base b = (base)d;
dynamic_cast
它與static_cast相對,是動態轉換。
這種轉換是在執行時進行轉換分析的,並非在編譯時進行,明顯區別於上面三個型別轉換操作。
該函式只能在繼承類物件的指標之間或引用之間進行型別轉換。進行轉換時,會根據當前執行時型別資訊,判斷型別物件之間的轉換是否合法。dynamic_cast的指標轉換失敗,可通過是否為null檢測,引用轉換失敗則丟擲乙個bad_cast異常。
例: class base{};
class derived : public base{};
//派生類指標轉換為基類指標
derived *pd = new derived;
base *pb = dynamic_cast(pd);
if (!pb)
cout << "型別轉換失敗" << endl;
//沒有繼承關係,但被轉換類有虛函式
class a(virtual ~a();) //有虛函式
class b{}:
a* pa = new a;
b* pb = dynamic_cast(pa);
如果對無繼承關係或者沒有虛函式的物件指標進行轉換、基本型別指標轉換以及基類指標轉換為派生類指標,都不能通過編譯。
參考文獻:
ORACLE中有哪些資料型別
字段型別 中文說明 限制條件 其它說明 char 固定長度字串 最大長度2000 bytes varchar2 可變長度的字串 最大長度4000 bytes 可做索引的最大長度749 nchar 根據字符集而定的固定長度字串 最大長度2000 bytes nvarchar2 根據字符集而定的可變長度...
JS中有哪些資料型別?
資料型別就是我可以了解到的是描述資料的型別 資料簡單的來說就是一些有用的資訊,它的最小空間 記憶體,硬碟 是位 8bit 二進位制 1byte 位元組 1024byte 1kb 1024kb 1mb 1024mb 1gb 1024gb 1tb js的資料型別 數字型別,字串型,布林型,undefin...
c 幾種型別轉換方式
1 初始化和賦值進行的轉換 1 float one 1 整型轉浮點型23 int guess 2.333 double轉int45 int debt 7.2e12 flot轉int 但是無法儲存過大資料 2 以 方式初始化時進行轉換 1 條件 不允許轉換最大範圍還大大的資料,比如float就不能轉換...