利用顯示轉換使得我們可以很容易發現它們,因為通過名字就能找到:
static_cast 用於“良性”和“適度良性”轉換,包括不用強制轉換 const_cast 對“const”和“volatile”進行轉換 reinterpret_cast 轉換為完全不同的意思,為了安全使用它,關鍵必須轉換為原來的類型 。這是所有轉換中最危險的 dynamic_cast 用於類型安全向下轉換1.靜態轉換(static_cast)
static_cast包含的轉換類型包括典型的非強制變換,窄化(有信息丟失)變換,使用void*的強制轉換,隱式類型變換和類層次的靜態定位。
用法:static_cast < type-id > ( expression )
該運算符把expression轉換為type-id類型,但沒有運行時類型檢查來保證轉換的安全性。它主要有如下幾種用法:
①用於類層次結構中基類和子類之間指針或引用的轉換。
進行上行轉換(把子類的指針或引用轉換成基類表示)是安全的;
進行下行轉換(把基類指針或引用轉換成子類表示)時,由於沒有動態類型檢查,所以是不安全的。
②用於基本數據類型之間的轉換,如把int轉換成char,把int轉換成enum。這種轉換的安全性也要開發人員來保證。
③把空指針轉換成目標類型的指針。
void func(int){}
int main()
{
int i=0x7fff;
long l;
float f;
//典型的非強制類型轉換
l=i;
f=i;
l=static_cast<long>(i);
f=static_cast<float>(i);
//窄化變換
i=l;
i=f;
i=static_cast<int>(l);
i=static_cast<int>(f);
char c=static_cast<char>(i);
//使用void* 的強制變換
void* vp=&i;
float* fp=(float*)vp;
//Error:C++中不用強制轉換是不能從void* 中賦值的
// fp=vp;
fp=static_cast<float*>(vp);
//隱式類型變換
double d=0.0;
int x=d;
x=static_cast<int>(d);
func(d);
func(static_cast<int>(d));
return 0;
}
2.常量變換(const_cast)
用法:const_cast<type_id> (expression)
該運算符用來修改類型的const或volatile屬性。除了const 或volatile修飾之外, type_id和expression的類型是一樣的。
常量指針被轉化成非常量指針,並且仍然指向原來的對象;
常量引用被轉換成非常量引用,並且仍然指向原來的對象;
如果從const轉換為非const,或從volatile轉換為非volatile,或者從非const轉換為const ,非volatile轉換為volatile可以使用const_cast。
int main()
{
const int i=0;
//Error:取得const對象的指針,不用轉換是不能把它賦值給非const指針的
// int* j=&i;
int* j=(int*)&i;
j=const_cast<int*>(&i);
//Error:const_cast<type_id>(expression)中除了const 或volatile修飾之外,type_id和expression的類型是一樣的
// long* l=const_cast<long*>(&i);
volatile int k=0;
int* u=const_cast<int*> (&k);
}
3.重解釋轉換(reinterpret_cast)
用法:reinterpret_cast<type-id> (expression)
type-id必須是一個指針、引用、算術類型、函數指針或者成員指針。
它可以把一個指針轉換成一個整數,也可以把一個整數轉換成一個指針(先把一個指針轉換成一個整數,在把該整數轉換成原類型的指針,還可以得到原先的指針值)。
這是最不安全的一種轉換機制。reinterpret_cast把對象假象成另一個完全一個不同類型的對象。reinterpret_cast的思想就是當需要使用的時候,所得到的東西已經不同了,以至於它不能用於類型的原來目的,除非再次把它轉換回來。
#include <iostream>
using namespace std;
const int sz=100;
struct X{int a[sz];};
void print(X* x)
{
for(int i=0;i<sz;i++)
{
cout<<x->a[i]<<" ";
}
cout<<endl<<"-----------------"<<endl;
}
int main()
{
X x;
print(&x); //出來的是沒有意義的值
int* xp=reinterpret_cast<int*>(&x);
for(int* i=xp;i<xp+sz;i++)
{
*i=0;
}
print(reinterpret_cast<X*>(xp));
print(&x);
}
c方式類型轉換:(target_type)(value),如int i = 5; char c = (char)(i);
c++方式類型轉換:方式有4種
static_cast類似c語言的類型轉換
dynamic_cast繼承體系直接引用和指針直接的轉換
const_cast常量轉換,常量轉換成非常量,非常量轉換成常量
reintepret_cast重新解釋轉換,重新解釋數值的含義,如int轉換成char*等
float a;
a=3.74
與
float a;
a=(float)3.74
是等價的.
所謂隱式類型轉換就是當精度小的數據賦給精度高的
數據時自動將精度小的轉換為精度高的如:
int a=3;
float b;
b=a;
當執行到b=a時,自動將a的值3轉換為浮點數的3
所謂的顯式類型轉換就是當精度高的數據賦給精度低
的數據時要顯示的轉換它如:
int a;
float b=3.23;
a=(int)b;
當執行到a=(int)b的時候顯示地將b轉換為整型賦給a