亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

c++顯式類型轉(zhuǎn)換示例詳解

 更新時(shí)間:2014年04月01日 15:56:03   作者:  
這篇文章主要介紹了c++顯式類型轉(zhuǎn)換示例詳解,需要的朋友可以參考下

標(biāo)準(zhǔn)C++包含一個(gè)顯式的轉(zhuǎn)換語法:

static_cast:用于“良性”和“適度良性”的轉(zhuǎn)換,包括不用強(qiáng)制轉(zhuǎn)換

const_cast:用于“const”和/或“volatile”進(jìn)行轉(zhuǎn)換

reinterpret_cast:轉(zhuǎn)換為完全不同的意思。為了安全的使用它,關(guān)鍵必須轉(zhuǎn)換回原來的類型。轉(zhuǎn)換成的類型一般只能用于位操作,否則就是為了其他隱秘的目的。這是所有轉(zhuǎn)換中最危險(xiǎn)的。

dynamic_cast:用于類型安全的向下轉(zhuǎn)換

-----常用-----

static_cast:用于所有明確定義的轉(zhuǎn)換,包括void*的強(qiáng)制轉(zhuǎn)換、隱式類型轉(zhuǎn)換、類層次的靜態(tài)定位。

1. 數(shù)據(jù)類型由小到大的轉(zhuǎn)換,比如int轉(zhuǎn)換為long或float;

復(fù)制代碼 代碼如下:

int i ; static_cast<long>(i); static_cast<float>(i);

2. 窄化轉(zhuǎn)換,即數(shù)據(jù)類型由大到小的轉(zhuǎn)換,可能丟失數(shù)據(jù);

3. c++中是不允許對(duì)一個(gè)void*類型的數(shù)據(jù)賦值的;

復(fù)制代碼 代碼如下:

void* ptr;  ptr = static_cast<void*>(i);


const_cast:常量轉(zhuǎn)換,如果從const轉(zhuǎn)換為非const或從volatile轉(zhuǎn)換為非volatile,可以使用const_cast。這是const_cast唯一允許的轉(zhuǎn)換。
復(fù)制代碼 代碼如下:

volatile int k = 0;   int* u = const_cast<int*>(&k);


四種顯式的類型轉(zhuǎn)換使用示例

1、reinterpret_cast
類型轉(zhuǎn)換函數(shù)將一個(gè)類型的指針,轉(zhuǎn)換為另一個(gè)類型的指針。這種轉(zhuǎn)換不需要修改指針變量值數(shù)據(jù)存放格式,只需在編譯時(shí)重新編譯解釋指針的類型就可。

復(fù)制代碼 代碼如下:

double d=9.3;
double *pd=&d;
int *pi=reinterpret_cast<int*>(pd);

但是不能用于非指針類型的轉(zhuǎn)換。
同隱式轉(zhuǎn)換一樣,reinterpret_cast也不能將一個(gè)const指針轉(zhuǎn)換為void*指針。

2、const_cast
用于去除指針變量的常量屬性,將它轉(zhuǎn)換為一個(gè)對(duì)應(yīng)指針類型的普通變量。也可以將一個(gè)非常量的指針變量轉(zhuǎn)換為一個(gè)常指針變量,在編譯期間做出類型更改。

復(fù)制代碼 代碼如下:

const int* pci=0;
int* pj=const_cast<int*>(pci);

基于安全性的考慮,const_cast無法將非指針的常變量轉(zhuǎn)換為普通變量。
可以將普通指針變量pi轉(zhuǎn)換為常指針變量,但不能將非指針的普通變量轉(zhuǎn)換為常變量。

3、static_cast
用于基本類型之間和具有繼承關(guān)系的類型之間的轉(zhuǎn)換,這種轉(zhuǎn)換一般會(huì)更改變量的內(nèi)部表示方式。用于指針類型轉(zhuǎn)換,沒有太大意義。

復(fù)制代碼 代碼如下:

class Base();
class Derived:public Base{}
Derived d;
Base d=static_cast<Base>(d);

可將繼承類對(duì)象轉(zhuǎn)換為基類對(duì)象。但是反過來不行。
注意:基類指針轉(zhuǎn)換為繼承類指針,在一定的危害性。

4、dynamic_cast
與static_cast相對(duì),是動(dòng)態(tài)dynamic_cast轉(zhuǎn)換。這種轉(zhuǎn)換是在運(yùn)行時(shí)進(jìn)行轉(zhuǎn)換分析的,并非在編譯時(shí)進(jìn)行。只能在繼承類對(duì)象的指針之間或引用之間進(jìn)行類型轉(zhuǎn)換。進(jìn)行轉(zhuǎn)換時(shí),會(huì)根據(jù)當(dāng)前(RTTI)判斷類型對(duì)象之間的轉(zhuǎn)換是否合法。dynamic_cast轉(zhuǎn)換失敗,是通過是否為null指針檢測(cè);引用轉(zhuǎn)換失敗,拋出bad_cast異常。
將繼承類指針或引用轉(zhuǎn)換為基類指針或引用可以,反過來一般不行;但是如果基類中有虛函數(shù)也可以,也就是說被轉(zhuǎn)換的類具有虛函數(shù)的對(duì)象指針時(shí),編譯也通過。

復(fù)制代碼 代碼如下:

class Base();
class Derived:public Base{}
Derived *pd=new Derived;
Base *d=dynamic_cast<Base*>(pd);

此外,如果沒有繼承關(guān)系,但是被轉(zhuǎn)換的類具有虛函數(shù)的對(duì)象指針時(shí),轉(zhuǎn)換也可編譯通過。
復(fù)制代碼 代碼如下:

int i;
long m;
m=static_cast<long>(i);
const int i=0;
int* j=(int*)&i;
j=const_cast<int*>(&i);//將const型轉(zhuǎn)換成volatile.

復(fù)制代碼 代碼如下:

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

相關(guān)文章

  • C/C++中獲取數(shù)組長度的方法示例

    C/C++中獲取數(shù)組長度的方法示例

    這篇文章主要介紹了C/C++中獲取數(shù)組長度的方法,很實(shí)用的一種方法,需要的朋友可以參考下
    2014-08-08
  • C語言實(shí)現(xiàn)三子棋小游戲(vs2013多文件)

    C語言實(shí)現(xiàn)三子棋小游戲(vs2013多文件)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)三子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C語言時(shí)間處理實(shí)例分享

    C語言時(shí)間處理實(shí)例分享

    這篇文章主要介紹了C語言時(shí)間處理實(shí)例分享的相關(guān)資料,需要的朋友可以參考下
    2015-07-07
  • C++ Boost Exception超詳細(xì)講解

    C++ Boost Exception超詳細(xì)講解

    Boost是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱。Boost庫是一個(gè)可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱
    2022-11-11
  • C語言改造通訊錄操作詳解

    C語言改造通訊錄操作詳解

    這篇文章主要介紹了C語言文件操作改造通訊錄方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-01-01
  • C++ 名稱空間詳情

    C++ 名稱空間詳情

    當(dāng)一個(gè)項(xiàng)目變得大型之后,我們會(huì)引入很多的庫,這么一來兩個(gè)庫很可能會(huì)定義List、Tree、Node同名的類,編譯器要是不考慮這情況的話,程序員調(diào)用時(shí)就會(huì)出現(xiàn)沖突問題。C++提供了名稱空間工具,以更好的控制名稱的作用域,本文就來談?wù)凜++ 名稱空間,需要的朋友可以參考一下
    2021-09-09
  • 關(guān)于c語言中輸出字符指針的相關(guān)問題

    關(guān)于c語言中輸出字符指針的相關(guān)問題

    這篇文章主要介紹了關(guān)于c語言中輸出字符指針的相關(guān)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C/C++中的static關(guān)鍵字詳解

    C/C++中的static關(guān)鍵字詳解

    這篇文章主要為大家詳細(xì)介紹了 C/C++中的static關(guān)鍵字,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C語言編程使用MATLAB繪制橢圓及圓角矩形

    C語言編程使用MATLAB繪制橢圓及圓角矩形

    這篇文章主要為大家介紹了C語言編程中使用MATLAB繪制橢圓及圓角矩形的實(shí)現(xiàn)源碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-02-02
  • C++中的變長參數(shù)深入理解

    C++中的變長參數(shù)深入理解

    變長參數(shù)的函數(shù),即參數(shù)個(gè)數(shù)可變、參數(shù)類型不定的函數(shù)。設(shè)計(jì)一個(gè)參數(shù)個(gè)數(shù)可變、參數(shù)類型不定的函數(shù)是可能的,最常見的例子是printf函數(shù)、scanf函數(shù)和高級(jí)語言的Format函數(shù)。最近的一個(gè)項(xiàng)目中就遇到這么一個(gè)相關(guān)的問題,感興趣的朋友們下面來一起看看吧。
    2016-10-10

最新評(píng)論