激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - C/C++ - c++顯式類型轉(zhuǎn)換示例詳解

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

2021-01-18 10:27C++教程網(wǎng) C/C++

這篇文章主要介紹了c++顯式類型轉(zhuǎn)換示例詳解,需要的朋友可以參考下

標(biāo)準(zhǔn)C++包含一個顯式的轉(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)換中最危險的。

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++中是不允許對一個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ù)將一個類型的指針,轉(zhuǎn)換為另一個類型的指針。這種轉(zhuǎn)換不需要修改指針變量值數(shù)據(jù)存放格式,只需在編譯時重新編譯解釋指針的類型就可。

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

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

 

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

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

復(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)換一般會更改變量的內(nèi)部表示方式。用于指針類型轉(zhuǎn)換,沒有太大意義。

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

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

 

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

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

 

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

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


此外,如果沒有繼承關(guān)系,但是被轉(zhuǎn)換的類具有虛函數(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;
}

延伸 · 閱讀

精彩推薦
  • C/C++學(xué)習(xí)C++編程的必備軟件

    學(xué)習(xí)C++編程的必備軟件

    本文給大家分享的是作者在學(xué)習(xí)使用C++進(jìn)行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C語言實現(xiàn)電腦關(guān)機(jī)程序

    C語言實現(xiàn)電腦關(guān)機(jī)程序

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)電腦關(guān)機(jī)程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內(nèi)存中的數(shù)據(jù)都是暫時的,當(dāng)程序結(jié)束時,它們都將丟失,為了永久性的保存大量的數(shù)據(jù),C語言提供了對文件的操作,這篇文章主要給大家介紹了關(guān)于C語言中文件...

    針眼_6702022-01-24
  • C/C++深入理解goto語句的替代實現(xiàn)方式分析

    深入理解goto語句的替代實現(xiàn)方式分析

    本篇文章是對goto語句的替代實現(xiàn)方式進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下...

    C語言教程網(wǎng)7342020-12-03
  • C/C++c++ 單線程實現(xiàn)同時監(jiān)聽多個端口

    c++ 單線程實現(xiàn)同時監(jiān)聽多個端口

    這篇文章主要介紹了c++ 單線程實現(xiàn)同時監(jiān)聽多個端口的方法,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數(shù)使用

    詳解c語言中的 strcpy和strncpy字符串函數(shù)使用

    strcpy 和strcnpy函數(shù)是字符串復(fù)制函數(shù)。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數(shù)使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++C/C++經(jīng)典實例之模擬計算器示例代碼

    C/C++經(jīng)典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關(guān)于C/C++經(jīng)典實例之模擬計算器的相關(guān)資料,文中通過示...

    jia150610152021-06-07
主站蜘蛛池模板: 亚洲人成中文字幕在线观看 | 欧美a一| 中文字幕极速在线观看 | 欧美日韩国产成人在线 | 羞羞网站在线观看入口免费 | 亚洲性视频 | 精精国产xxxx视频在线野外 | 九九热九九热 | 成人国产精品久久 | 日韩视频在线观看免费视频 | 亚洲一区在线免费视频 | 91精品国产九九九久久久亚洲 | 国产午夜亚洲精品 | 国产成人精品免费视频大全最热 | 黄色的视频免费观看 | 国产资源在线看 | 成人精品一区二区三区中文字幕 | 九色免费视频 | 久久久久久久久91 | 一级成人欧美一区在线观看 | 亚洲一区二区网址 | 毛片在线免费观看完整版 | 欧美999| 久草导航 | 欧美日韩视频网站 | 欧美人一级淫片a免费播放 久久久久久久久91 国产99久久久久久免费看 | 久久久一二三 | 久久中文字幕在线观看 | 亚洲精品永久视频 | 久草导航 | 日本a∨精品中文字幕在线 被啪羞羞视频在线观看 | 久久影院yy6080 | 欧美一区二区三区久久综合 | 欧美日韩国产成人在线 | 欧美成网 | 欧美 中文字幕 | 亚洲欧美不卡视频 | 国产一区二区免费在线观看 | 国产一级淫片在线观看 | 天天干导航 | 被狠狠操 |