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

服務器之家:專注于服務器技術及軟件下載分享
分類導航

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

香港云服务器
服務器之家 - 編程語言 - C/C++ - 基于c++強制類型轉換的(總結)詳解

基于c++強制類型轉換的(總結)詳解

2020-11-24 16:22C++教程網 C/C++

本篇文章對C++中的強制類型轉換進行了詳細的分析介紹。需要的朋友參考下

什么是類型轉換?  

  類型轉換的含義是通過改變一個變量的類型為別的類型從而改變該變量的表示方式。為了類型轉換一個簡單對象為另一個對象你會使用傳統的類型轉換操作符。

C與C++的類型轉換

C中:

復制代碼 代碼如下:

(T)element 或者 T(element)


c++中:

復制代碼 代碼如下:

reinterpret_cast<T*> (expression)
dynamic_cast<T*>     (expression)
static_cast<T*>      (expression)
const_cast<T*>       (expression)

 

 

C++的四種強制轉型形式每一種適用于特定的目的: 

   ·dynamic_cast 主要用于執行“安全的向下轉型(safe downcasting)”,也就是說,要確定一個對象是否是一個繼承體系中的一個特定類型。它是唯一不能用舊風格語法執行的強制轉型,也是唯一可能有重大運行時代價的強制轉型。
    
      ·static_cast 可以被用于強制隱型轉換(例如,non-const 對象轉型為 const 對象,int 轉型為 double,等等),它還可以用于很多這樣的轉換的反向轉換(例如,void* 指針轉型為有類型指針,基類指針轉型為派生類指針),但是它不能將一個 const 對象轉型為 non-const 對象(只有 const_cast 能做到),它最接近于C-style的轉換。
    
    ·const_cast 一般用于強制消除對象的常量性。它是唯一能做到這一點的 C++ 風格的強制轉型。 

  ·reinterpret_cast 是特意用于底層的強制轉型,導致實現依賴(implementation-dependent)(就是說,不可移植)的結果,例如,將一個指針轉型為一個整數。這樣的強制轉型在底層代碼以外應該極為罕見。

通俗的解釋:

dynamic_cast

通常在基類和派生類之間轉換時使用

static_cast

  一般的轉換,如果你不知道該用哪個,就用這

const_cast

主要針對const和volatile的轉換

reinterpret_cast

 用于進行沒有任何關聯之間的轉換,比如一個字符指針轉換為一個整形數

 

 具體分析:

1)static_cast<T*>(a) 編譯器在編譯期處理

  •   將地址a轉換成類型T,T和a必須是指針、引用、算術類型或枚舉類型。
  •   表達式static_cast<T*>(a), a的值轉換為模板中指定的類型T。
  •   在運行時轉換過程中,不進行類型檢查來確保轉換的安全性。
  •   static_cast它能在內置的數據類型間互相轉換,對于類只能在有聯系的指針類型間進行轉換。可以在繼承體系中把指針轉換來、轉換去,但是不能轉換成繼承體系外的一種類型
復制代碼 代碼如下:

class A { ... };
class B { ... };
class D : public B { ... };
void f(B* pb, D* pd)
{
    D* pd2 = static_cast<D*>(pb);        // 不安全, pb可能只是B的指針
    B* pb2 = static_cast<B*>(pd);        // 安全的
    A* pa2 = static_cast<A*>(pb);        //錯誤A與B沒有繼承關系
    ...
}

 

2)dynamic_cast<T*>(a) 在運行期,會檢查這個轉換是否可能

  •   完成類層次結構中的提升。T必須是一個指針、引用或無類型的指針。a必須是決定一個指針或引用的表達式。
  •   dynamic_cast 僅能應用于指針或者引用,不支持內置數據類型
  •   表達式dynamic_cast<T*>(a) 將a值轉換為類型為T的對象指針。如果類型T不是a的某個基類型,該操作將返回一個空指針。
  •   它不僅僅像static_cast那樣,檢查轉換前后的兩個指針是否屬于同一個繼承樹,它還要檢查被指針引用的對象的實際類型,確定轉換是否可行。
  •   如果可以,它返回一個新指針,甚至計算出為處理多繼承的需要的必要的偏移量。如果這兩個指針間不能轉換,轉換就會失敗,此時返回空指針(NULL)。
  •   很明顯,為了讓dynamic_cast能正常工作,必須讓編譯器支持運行期類型信息(RTTI)。

 

復制代碼 代碼如下:


class Base { virtual dummy() {} };
class Derived : public Base {};

 

Base* b1 = new Derived;
Base* b2 = new Base;

Derived* d1 = dynamic_cast<Derived *>(b1);          // succeeds
Derived* d2 = dynamic_cast<Derived *>(b2);          // fails: returns 'NULL'

 

3)const_cast<T*>(a)編譯器在編譯期處理

  •       去掉類型中的常量,除了const或不穩定的變址數,T和a必須是相同的類型。
  •       表達式const_cast<T*>(a)被用于從一個類中去除以下這些屬性:const, volatile, 和 __unaligned。
  •       對于本身定義時為const的類型,即使你去掉const性,在你操作這片內容時候也要小心,只能r不能w操作,否則還是會出錯
  •       const_cast操作不能在不同的種類間轉換。相反,它僅僅把一個它作用的表達式轉換成常量。它可以使一個本來不是const類型的數據轉換成const類型的,或者把const屬性去掉。

 

復制代碼 代碼如下:


class A { ... };
void f()
{
    const A *pa = new A;//const對象
    A *pb;//非const對象
    //pb = pa; // 這里將出錯,不能將const對象指針賦值給非const對象
    pb = const_cast<A*>(pa); // 現在OK了
    ...
}

 

const char* p = "123";
char* c = const_cast<char*>(p);
c[0] = 1;   //表面上通過編譯去掉了const性,但是操作其地址時系統依然不允許這么做。

 

4)reinterpret_cast<T*>(a)編譯器在編譯期處理

  • 任何指針都可以轉換成其它類型的指針,T必須是一個指針、引用、算術類型、指向函數的指針或指向一個類成員的指針。
  • 表達式reinterpret_cast<T*>(a)能夠用于諸如char* 到 int*,或者One_class* 到 Unrelated_class*等類似這樣的轉換,因此可能是不安全的。

 

復制代碼 代碼如下:

class A { ... };
class B { ... };
void f()
{
    A* pa = new A;
    void* pv = reinterpret_cast<A*>(pa);
    // pv 現在指向了一個類型為B的對象,這可能是不安全的
    ...
}

延伸 · 閱讀

精彩推薦
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

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

    C語言教程網7342020-12-03
  • C/C++C語言中炫酷的文件操作實例詳解

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

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

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

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

    spring-go5642021-07-02
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

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

    謝恩銘10102021-05-08
  • C/C++C++之重載 重定義與重寫用法詳解

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

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

    青山的青6062022-01-04
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

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

    源之緣11542021-10-27
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

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

    xiaocaidayong8482021-08-20
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

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

    jia150610152021-06-07
420
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 深夜精品福利 | 国产乱淫a∨片免费视频 | a视频网站| 精品国产一二区 | 日韩av电影在线免费观看 | 桥本有菜免费av一区二区三区 | 黄网站免费入口 | 成人午夜一区 | 欧美一区二区精品夜夜嗨 | 国产成人精品午夜 | 日本xxxx色视频在线观看免费, | 国内精品视频饥渴少妇在线播放 | 久久草在线视频免费 | 欧美一区二区网站 | av在线电影网址 | 视频一区二区中文字幕 | 羞羞视频免费网站男男 | av之家在线观看 | 国产精品99久久久久久久vr | 成年毛片 | 久久精品日产第一区二区三区 | 久久狠狠高潮亚洲精品 | 免费男女视频 | 天天看天天摸天天操 | 亚洲影院在线 | 中文字幕综合在线观看 | 久久96国产精品久久秘臀 | 久久久久一区二区三区四区五区 | 精品三区视频 | 久久亚洲精品久久国产一区二区 | 欧美成人鲁丝片在线观看 | 国产免费中文字幕 | 国产一区亚洲 | 中文字幕伦乱 | 国产精品av久久久久久网址 | 国产羞羞视频在线观看 | 亚洲国产精久久久久久久 | 黄色a级片视频 | 一级国产精品一级国产精品片 | 蜜桃网在线观看 | 久久久久久久亚洲精品 |