一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

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

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
主站蜘蛛池模板: 动漫美女胸被狂揉扒开吃奶动态图 | 日本性生活大片 | 999精品视频在线 | 久久九九亚洲精品 | 国产成年人在线观看 | 女同学高中你下面好紧 | 第一福利在线视频 | 欧美一级片观看 | 午夜黄视频 | 欧美黑人换爱交换乱理伦片 | 久久理论片迅播影院一级 | 国产高清不卡视频在线播放 | 深夜福利一区 | 成年人视频在线免费看 | 亚洲国产精品嫩草影院永久 | 国产japanese孕妇孕交 | 白丝捆绑调教 | 国产香蕉国产精品偷在线观看 | 金莲你下面好紧夹得我好爽 | 免费被黄网站在观看 | 男生操男生 | 91天堂在线 | 欧美精品久久久久久久免费观看 | www亚洲国产 | 98pao强力打造高清免费 | 9re视频这里只有精品 | 欧美人与物videos另类3d | 嫩草影院地址一地址二 | 东北恋哥在线播放免费播放 | 亚洲七七久久综合桃花 | 欧美牛逼aa | 国产欧美精品一区二区三区四区 | 厨房里摸着乳丰满在线观看 | 免费观看毛片视频 | 日本xxxxx69hd日本 | 国产精品66福利在线观看 | 日本色资源 | 欧美2区| 亚洲不卡视频 | 国产精品一区二区不卡的视频 | 青青热久久综合网伊人 |