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

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

 更新時(shí)間:2025年06月20日 10:25:45   作者:qq_45576085  
這篇文章主要為大家詳細(xì)介紹了C++中四種強(qiáng)制轉(zhuǎn)換的實(shí)現(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,但它不能用于兩個(gè)不相關(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)換為派生類指針/引用(需程序員寶成對(duì)象類型正確,否則不安全)

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 實(shí)際指向 Derived)

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

如果類定義了自定義的類型轉(zhuǎn)換運(yù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必須是一個(gè)指針,引用,算術(shù)類型,函數(shù)指針,成員指針等。

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

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

reinterpret_cast可以把一個(gè)整型轉(zhuǎn)換為指針,也可以把一個(gè)指針轉(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用于將一個(gè)父類對(duì)象的指針/引用轉(zhuǎn)換為子類對(duì)象的指針或引用(動(dòng)態(tài)轉(zhuǎn)換)

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

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

注意:

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

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

class A
{
    public :
    virtual void f(){}
};
class B : public A
{};
 
void fun (A* pa)
{
    // dynamic_cast會(huì)先檢查是否能轉(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ā)生錯(cuò)誤的機(jī)會(huì)。

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

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

相關(guān)文章

  • 構(gòu)建mfc窗體的簡(jiǎn)單示例

    構(gòu)建mfc窗體的簡(jiǎn)單示例

    這篇文章主要介紹了構(gòu)建mfc窗體的簡(jiǎn)單示例,需要的朋友可以參考下
    2014-04-04
  • c語言實(shí)現(xiàn)的hashtable分享

    c語言實(shí)現(xiàn)的hashtable分享

    哈希表效率高,眾所周知。應(yīng)用廣泛,php中大部分存儲(chǔ)使用的都是hashtable,包括變量,數(shù)組…如何使用c語言實(shí)現(xiàn)hashtable呢,現(xiàn)提供自己的思路,如有不妥之處,敬請(qǐng)賜教
    2014-01-01
  • C++中標(biāo)準(zhǔn)線程庫的基本使用介紹

    C++中標(biāo)準(zhǔn)線程庫的基本使用介紹

    大家好,本篇文章主要講的是C++中標(biāo)準(zhǔn)線程庫的基本使用介紹,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-02-02
  • C語言實(shí)現(xiàn)二叉樹層次遍歷介紹

    C語言實(shí)現(xiàn)二叉樹層次遍歷介紹

    大家好,本篇文章主要講的是C語言實(shí)現(xiàn)二叉樹層次遍歷介紹,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • 淺談C語言函數(shù)調(diào)用參數(shù)壓棧的相關(guān)問題

    淺談C語言函數(shù)調(diào)用參數(shù)壓棧的相關(guān)問題

    下面小編就為大家?guī)硪黄獪\談C語言函數(shù)調(diào)用參數(shù)壓棧的相關(guān)問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-09-09
  • C++實(shí)現(xiàn)二叉樹的堂兄弟節(jié)點(diǎn)查詢

    C++實(shí)現(xiàn)二叉樹的堂兄弟節(jié)點(diǎn)查詢

    C++實(shí)現(xiàn)二叉樹的堂兄弟節(jié)點(diǎn)查詢,是指在二叉樹中,找到兩個(gè)節(jié)點(diǎn)深度相同但父節(jié)點(diǎn)不同的節(jié)點(diǎn),即為堂兄弟節(jié)點(diǎn)。實(shí)現(xiàn)這一功能可以通過遍歷二叉樹并記錄節(jié)點(diǎn)深度和父節(jié)點(diǎn)來實(shí)現(xiàn)
    2023-04-04
  • C++?Boost?Xpressive示例分析使用

    C++?Boost?Xpressive示例分析使用

    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++ 入門——淺析構(gòu)造函數(shù)和析構(gòu)函數(shù)

    c++ 入門——淺析構(gòu)造函數(shù)和析構(gòu)函數(shù)

    這篇文章主要介紹了c++ 淺析構(gòu)造函數(shù)和析構(gòu)函數(shù)的相關(guān)資料,幫助大家入門c++ 編程,感興趣的朋友可以了解下
    2020-08-08
  • C語言中的狀態(tài)機(jī)設(shè)計(jì)深入講解

    C語言中的狀態(tài)機(jī)設(shè)計(jì)深入講解

    這篇文章主要給大家介紹了關(guān)于C語言狀態(tài)機(jī)設(shè)計(jì)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • C/C++從零開始的cmake教程

    C/C++從零開始的cmake教程

    今天小編就為大家分享一篇關(guān)于C/C++從零開始的cmake教程,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-10-10

最新評(píng)論