最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中四種強(qiáng)制轉(zhuǎn)換的實現(xiàn)方法與區(qū)別

 更新時間:2025年06月20日 10:25:45   作者:qq_45576085  
這篇文章主要為大家詳細(xì)介紹了C++中四種強(qiáng)制轉(zhuǎn)換的實現(xiàn)方法與區(qū)別,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

static_cast

原型:static_cast<type-id>(expression)            type-id表示目標(biāo)類型,expression表示要轉(zhuǎn)換的表達(dá)式

static_cast用于非多態(tài)類型的轉(zhuǎn)換(靜態(tài)轉(zhuǎn)換),編譯器隱式執(zhí)行的任何類型轉(zhuǎn)換都可用static_cast,但它不能用于兩個不相關(guān)的類型進(jìn)行轉(zhuǎn)換。

int main()
{
  double d = 12.34;
  int a = static_cast<int>(d);
  cout<<a<<endl;
  return 0;
}

static_cast的相關(guān)類型通常包括以下幾種情況:

1、隱式類型允許的數(shù)值類型轉(zhuǎn)換

基礎(chǔ)數(shù)據(jù)類型之間的轉(zhuǎn)換,比如int→float,double→int等,只要不丟失精度或存在明確的數(shù)值轉(zhuǎn)換規(guī)則。

枚舉類型與整數(shù)之間的轉(zhuǎn)換:將枚舉值(enum)轉(zhuǎn)換為其底層整數(shù)類型(如int)。

空指針(nullptr)到其他指針類型的轉(zhuǎn)換,例如nullptr→int*

int a = 10;
float b = static_cast<float>(a);  // int → float
enum Color { Red, Green };
int c = static_cast<int>(Color::Red);  // 枚舉 → int

2、類層次中的上行或下行轉(zhuǎn)換

上行轉(zhuǎn)換:將派生類指針/引用轉(zhuǎn)換為基類指針/引用(安全且無需顯示檢查)

下行轉(zhuǎn)換:將基類指針/引用轉(zhuǎn)換為派生類指針/引用(需程序員寶成對象類型正確,否則不安全)

class Base {};
class Derived : public Base {};
 
Derived d;
Base* b_ptr = static_cast<Base*>(&d);  // 上行轉(zhuǎn)換(安全)
 
Base* base = new Derived();
Derived* derived = static_cast<Derived*>(base);  // 下行轉(zhuǎn)換(需確保 base 實際指向 Derived)

3、用戶定義的轉(zhuǎn)換操作符

如果類定義了自定義的類型轉(zhuǎn)換運算符operator TargetType(),static_cast可以顯式調(diào)用這些轉(zhuǎn)換。

class MyInt {
public:
  operator int() const { return value; }  // 自定義轉(zhuǎn)換到 int
  int value = 42;
};
 
MyInt mi;
int x = static_cast<int>(mi);  // 調(diào)用 MyInt::operator int()

4、void*與具體類型指針的轉(zhuǎn)換

將void*轉(zhuǎn)換為具體類型指針(需確保原始指針類型匹配)

將具體類型指針轉(zhuǎn)換為void*(通常隱式允許,但可用static_cast顯示表達(dá))

int* p = new int(42);
void* vp = static_cast<void*>(p);  // int* → void*
int* p2 = static_cast<int*>(vp);   // void* → int*(需確保 vp 原本是 int*)

reinterpret_cast

reinterpret_cast的原型為:reinterpret_cast<typeid> (expression).type_id必須是一個指針,引用,算術(shù)類型,函數(shù)指針,成員指針等。

reinterpret_cast操作符通常為操作數(shù)的位模式提供較低層次的重新解釋,用于將一種類型轉(zhuǎn)換為另一種不同的類型

int main()
{
 double d = 12.34;
 int a = static_cast<int>(d);
 cout << a << endl;
 // 這里使用static_cast會報錯,應(yīng)該使用reinterpret_cast
 //int *p = static_cast<int*>(a);
 int *p = reinterpret_cast<int*>(a);
 return 0;
}

reinterpret_cast可以把一個整型轉(zhuǎn)換為指針,也可以把一個指針轉(zhuǎn)換為整型??偨Y(jié)來說,reinterpret_cast可以允許任何指針類型(引用)之間的轉(zhuǎn)換,整型與指針類型間的轉(zhuǎn)換以及指針與足夠大的整型之間的轉(zhuǎn)換。

const_cast

原型const_cast<type-name>(expression)      其中,type-name表示要轉(zhuǎn)換成的類型,expression是要進(jìn)行轉(zhuǎn)換的表達(dá)式。

const_cast最常用的用途就是刪除變量的const屬性,方便賦值

void Test ()
{
  const int a = 2;
  int* p = const_cast< int*>(&a );
  *p = 3;
  cout<<a <<endl;
}

dynamic_cast

其中,T是目標(biāo)類型,expression是要轉(zhuǎn)換的表達(dá)式。

dynamic_cast用于將一個父類對象的指針/引用轉(zhuǎn)換為子類對象的指針或引用(動態(tài)轉(zhuǎn)換)

向上轉(zhuǎn)換:子類對象指針/引用→父類指針/引用(不需要轉(zhuǎn)換,賦值兼容規(guī)則)

向下轉(zhuǎn)換:父類對象指針/引用→子類指針/引用(用dynamic_cast轉(zhuǎn)換是安全的)

注意:

1、dynamic_cast只能用于父類含有虛函數(shù)的類

2、dynamic_cast會先檢查是否能轉(zhuǎn)換成功,能成功則轉(zhuǎn)換,不能則返回nullptr

class A
{
    public :
    virtual void f(){}
};
class B : public A
{};
 
void fun (A* pa)
{
    // dynamic_cast會先檢查是否能轉(zhuǎn)換成功,能成功則轉(zhuǎn)換,不能則返回
    B* pb1 = static_cast<B*>(pa);
    B* pb2 = dynamic_cast<B*>(pa);
    cout<<"pb1:" <<pb1<< endl;
    cout<<"pb2:" <<pb2<< endl;
}
int main ()
{
  A a;
  B b;
  fun(&a);
  fun(&b);
  return 0;
}

注意

強(qiáng)制類型轉(zhuǎn)換關(guān)閉或掛起了正常的類型檢查,每次使用強(qiáng)制類型轉(zhuǎn)換前,程序員應(yīng)該仔細(xì)考慮的是否還有其他不同的方法達(dá)到同一目的,如果非強(qiáng)制類型轉(zhuǎn)換不可,則應(yīng)限制強(qiáng)制轉(zhuǎn)換值的作用域,以減少發(fā)生錯誤的機(jī)會。

強(qiáng)烈建議:避免使用強(qiáng)制類型轉(zhuǎn)換

到此這篇關(guān)于C++中四種強(qiáng)制轉(zhuǎn)換的實現(xiàn)方法與區(qū)別的文章就介紹到這了,更多相關(guān)C++強(qiáng)制轉(zhuǎn)換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何區(qū)分C++中的inline和#define宏

    如何區(qū)分C++中的inline和#define宏

    這篇文章主要介紹了如何區(qū)分C++中的inline和#define宏,文中講解非常詳細(xì),代碼幫助大家更好的參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • C++中的string庫函數(shù)常見函數(shù)的作用和使用方法

    C++中的string庫函數(shù)常見函數(shù)的作用和使用方法

    這篇文章主要介紹了C++中的string庫函數(shù)常見函數(shù)的作用和使用方法,庫函數(shù)的靈活應(yīng)用是程序員的一大重要技能,本文通過實例實例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • C語言順序結(jié)構(gòu)的二叉樹之堆排序

    C語言順序結(jié)構(gòu)的二叉樹之堆排序

    對于初學(xué)者來說,二叉樹的深入理解將有助于掌握更多高級數(shù)據(jù)結(jié)構(gòu),例如堆、圖等,這篇文章主要介紹了C語言順序結(jié)構(gòu)的二叉樹之堆排序的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2026-01-01
  • Matlab處理圖像后實現(xiàn)簡單的人臉檢測

    Matlab處理圖像后實現(xiàn)簡單的人臉檢測

    本文主要介紹一下如何使用matlab進(jìn)行圖像處理后實現(xiàn)人臉檢測,感興趣的可以了解一下
    2021-11-11
  • pthread_once函數(shù)使用場景與原理

    pthread_once函數(shù)使用場景與原理

    pthread_once 是 POSIX 線程庫中的一個函數(shù),主要用于確保某個初始化操作在多線程環(huán)境中只執(zhí)行一次,即使多個線程同時嘗試執(zhí)行該操作,本文就來介紹一下pthread_once函數(shù)使用場景與原理,感興趣的可以了解一下
    2025-12-12
  • C++ const關(guān)鍵字分析詳解

    C++ const關(guān)鍵字分析詳解

    C++中的const關(guān)鍵字的用法非常靈活,而使用const將大大改善程序的健壯性。這篇文章主要介紹了C/C++ 中const關(guān)鍵字的用法,需要的朋友可以參考下
    2021-08-08
  • Qt數(shù)據(jù)庫應(yīng)用之通用數(shù)據(jù)庫同步

    Qt數(shù)據(jù)庫應(yīng)用之通用數(shù)據(jù)庫同步

    數(shù)據(jù)庫同步的主要功能是將本地的數(shù)據(jù)庫記錄同步到遠(yuǎn)程的數(shù)據(jù)庫。本文將利用Qt實現(xiàn)通用數(shù)據(jù)庫同步功能,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-03-03
  • C++隱式轉(zhuǎn)換問題分析及解決辦法

    C++隱式轉(zhuǎn)換問題分析及解決辦法

    在本篇文章里小編給大家整理了關(guān)于C++隱式轉(zhuǎn)換問題分析及解決辦法,有需要的朋友們可以學(xué)習(xí)下。
    2020-02-02
  • C++通過文件指針獲取文件大小的方法實現(xiàn)

    C++通過文件指針獲取文件大小的方法實現(xiàn)

    本文主要介紹了C++通過文件指針獲取文件大小的方法實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C/C++中*和&的用法詳解

    C/C++中*和&的用法詳解

    在本篇文章中我們給大家總結(jié)了C/C++中*和&的用法以及相關(guān)的代碼分享,有興趣的朋友趕緊學(xué)習(xí)下吧。
    2018-03-03

最新評論

安乡县| 平和县| 葵青区| 大理市| 桃源县| 武清区| 大新县| 肇州县| 昆明市| 平定县| 嘉定区| 竹溪县| 绥宁县| 从江县| 大关县| 锦屏县| 资中县| 吴堡县| 封开县| 阜阳市| 象山县| 河曲县| 铜川市| 成都市| 福州市| 屯留县| 区。| 清镇市| 平塘县| 修水县| 五原县| 建水县| 南昌市| 三江| 周口市| 南乐县| 长岭县| 谢通门县| 柏乡县| 青海省| 中西区|