c++顯式類型轉換示例詳解。本站提示廣大學習愛好者:(c++顯式類型轉換示例詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是c++顯式類型轉換示例詳解正文
尺度C++包括一個顯式的轉換語法:
static_cast:用於“良性”和“過度良性”的轉換,包含不消強迫轉換
const_cast:用於“const”和/或“volatile”停止轉換
reinterpret_cast:轉換為完整分歧的意思。為了平安的應用它,症結必需轉換回本來的類型。轉換成的類型普通只能用於位操作,不然就是為了其他隱蔽的目標。這是一切轉換中最風險的。
dynamic_cast:用於類型平安的向下轉換
-----經常使用-----
static_cast:用於一切明白界說的轉換,包含void*的強迫轉換、隱式類型轉換、類條理的靜態定位。
1. 數據類型由小到年夜的轉換,好比int轉換為long或float;
int i ; static_cast<long>(i); static_cast<float>(i);
2. 窄化轉換,即數據類型由年夜到小的轉換,能夠喪失數據;
3. c++中是不許可對一個void*類型的數據賦值的;
void* ptr; ptr = static_cast<void*>(i);
const_cast:常量轉換,假如從const轉換為非const或從volatile轉換為非volatile,可使用const_cast。這是const_cast獨一許可的轉換。
volatile int k = 0; int* u = const_cast<int*>(&k);
四種顯式的類型轉換應用示例
1、reinterpret_cast
類型轉換函數將一個類型的指針,轉換為另外一個類型的指針。這類轉換不須要修正指針變量值數據寄存格局,只需在編譯時從新編譯說明指針的類型便可。
double d=9.3;
double *pd=&d;
int *pi=reinterpret_cast<int*>(pd);
然則不克不及用於非指針類型的轉換。
同隱式轉換一樣,reinterpret_cast也不克不及將一個const指針轉換為void*指針。
2、const_cast
用於去除指針變量的常量屬性,將它轉換為一個對應指針類型的通俗變量。也能夠將一個異常量的指針變量轉換為一個常指針變量,在編譯時代做出類型更改。
const int* pci=0;
int* pj=const_cast<int*>(pci);
基於平安性的斟酌,const_cast沒法將非指針的常變量轉換為通俗變量。
可以將通俗指針變量pi轉換為常指針變量,但不克不及將非指針的通俗變量轉換為常變量。
3、static_cast
用於根本類型之間和具有繼續關系的類型之間的轉換,這類轉換普通會更轉變量的外部表現方法。用於指針類型轉換,沒有太年夜意義。
class Base();
class Derived:public Base{}
Derived d;
Base d=static_cast<Base>(d);
可將繼續類對象轉換為基類對象。然則反過去不可。
留意:基類指針轉換為繼續類指針,在必定的傷害性。
4、dynamic_cast
與static_cast絕對,是靜態dynamic_cast轉換。這類轉換是在運轉時停止轉換剖析的,並不是在編譯時停止。只能在繼續類對象的指針之間或援用之間停止類型轉換。停止轉換時,會依據以後(RTTI)斷定類型對象之間的轉換能否正當。dynamic_cast轉換掉敗,是經由過程能否為null指針檢測;援用轉換掉敗,拋出bad_cast異常。
將繼續類指針或援用轉換為基類指針或援用可以,反過去普通不可;然則假如基類中有虛函數也能夠,也就是說被轉換的類具有虛函數的對象指針時,編譯也經由過程。
class Base();
class Derived:public Base{}
Derived *pd=new Derived;
Base *d=dynamic_cast<Base*>(pd);
另外,假如沒有繼續關系,然則被轉換的類具有虛函數的對象指針時,轉換也可編譯經由過程。
int i;
long m;
m=static_cast<long>(i);
const int i=0;
int* j=(int*)&i;
j=const_cast<int*>(&i);//將const型轉換成volatile.
#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);//cast &x to int*
for(int* i=xp;i<xp+sz;i++)
*i=0;
//cannot use xp as an X* at this point usless you cast it bakc;
print(reinterpret_cast<X*>(xp));
print(&x);
return 1;
}