程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> c++顯式類型轉換示例詳解

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

編輯:關於C++

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved