欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

static_cast

原型:static_cast<type-id>(expression)            type-id表示目標類型,expression表示要轉換的表達式

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

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

static_cast的相關類型通常包括以下幾種情況:

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

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

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

空指針(nullptr)到其他指針類型的轉換,例如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、類層次中的上行或下行轉換

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

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

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

3、用戶定義的轉換操作符

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

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

4、void*與具體類型指針的轉換

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

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

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ù)指針,成員指針等。

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

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

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

const_cast

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

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

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

dynamic_cast

其中,T是目標類型,expression是要轉換的表達式。

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

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

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

注意:

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

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

class A
{
    public :
    virtual void f(){}
};
class B : public A
{};
 
void fun (A* pa)
{
    // dynamic_cast會先檢查是否能轉換成功,能成功則轉換,不能則返回
    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;
}

注意

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

強烈建議:避免使用強制類型轉換

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

相關文章

  • 構建mfc窗體的簡單示例

    構建mfc窗體的簡單示例

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

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

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

    C++中標準線程庫的基本使用介紹

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

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

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

    淺談C語言函數(shù)調用參數(shù)壓棧的相關問題

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

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

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

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

    Boost是為C++語言標準庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標準庫的后備,是C++標準化進程的開發(fā)引擎之一,是為C++語言標準庫提供擴展的一些C++程序庫的總稱
    2022-11-11
  • c++ 入門——淺析構造函數(shù)和析構函數(shù)

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

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

    C語言中的狀態(tài)機設計深入講解

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

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

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

最新評論