国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

c++顯式類型轉換示例詳解

2020-01-26 15:33:19
字體:
來源:轉載
供稿:網友

標準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;
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 精河县| 武宁县| 乾安县| 卓尼县| 错那县| 景泰县| 乐安县| 襄城县| 闽清县| 南投市| 丰镇市| 灵石县| 开平市| 农安县| 保山市| 安达市| 巴里| 江津市| 富锦市| 安多县| 开鲁县| 新建县| 彝良县| 小金县| 贡山| 图们市| 石台县| 保康县| 恩平市| 建宁县| 中阳县| 涞源县| 仲巴县| 内乡县| 抚远县| 井研县| 东阳市| 永仁县| 包头市| 长丰县| 雷波县|