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

一文帶你探索C++中類型轉(zhuǎn)換的奧秘

 更新時間:2023年10月25日 14:02:54   作者:大神仙  
C++?提供了四種類型轉(zhuǎn)換方式,幫助我們在不同數(shù)據(jù)類型之間進行有效的數(shù)據(jù)傳遞和操作,這些類型轉(zhuǎn)換方式在不同的場景下有各自的優(yōu)勢和適用性,下面我們就來深入了解一下吧

const_cast(常量轉(zhuǎn)換)

const_cast(常量轉(zhuǎn)換)是一種類型轉(zhuǎn)換運算符,用于修改類型的const或volatile屬性。它通常用于將const變量轉(zhuǎn)換為非常量類型,或者將volatile變量轉(zhuǎn)換為非volatile類型。用法如下:

const_cast<new_type>(expression)

new_type是你要轉(zhuǎn)換成的類型,expression是要被轉(zhuǎn)換的表達式。

示例

int main() {

    const int a = 10;

    //    int* pA = &a;//編譯錯誤,不能將一個非常量指針指向一個常量對象。
    int* pA = const_cast<int*>(&a);
    *pA = 20;

    //輸入10 20
    cout << "a:" << a << " *pA:" << *pA  << endl;
}

上面的代碼定義一個 const int 類型的變量 a,我們想要將其轉(zhuǎn)換為 int 類型。直接用一個指針pA指向這個a時,由于a本身是const類型,會導致編譯錯誤。所以我們可以用 const_cast 把它做一個類型轉(zhuǎn)換,去除 a 的 const 修飾符。然后修改 *pA 的值。

但是大家需要注意,最后的打印輸出是a:10 *pA:20。

即使你使用 const_cast 去除了指向 a的指針的常量性, *pA = 20 修改了*pA 的值,實際上并不會影響 a 的輸出,這是 C++ 語言的常量性規(guī)則所決定的。因為它是一個常量。在編譯時,編譯器將 a 的值直接插入到代碼中,而不是通過指針 pA 訪問 a。因此無論如何修改 *pAa的值都保持不變。

const_cast 在某些情況下可以提高代碼的可讀性和減少冗余代碼,但也存在一些缺點,例如增加代碼的復雜度和容易產(chǎn)生歧義。

reinterpret_cast(重新解釋轉(zhuǎn)換)

reinterpret_cast是一種非常危險類型轉(zhuǎn)換。它不會檢查我們所指向的內(nèi)容,也不會檢查我們這個類型的本身。它只是做了一個重新的解釋,我們要在轉(zhuǎn)換的過程當中,保證它轉(zhuǎn)換前和轉(zhuǎn)換后占用的內(nèi)存大小應該是一致的。用于在不同類型的指針之間進行轉(zhuǎn)換,用法如下:

reinterpret_cast<new_type>(expression)

示例

int Test() {
    std::cout << "Test function called." << std::endl;
    return 0;
}

int main() {

    //創(chuàng)建一個 FuncPtr 的函數(shù)指針類型。指向沒有參數(shù)和返回值的函數(shù)。
    typedef void(*FuncPtr) ();
    FuncPtr funcPtr;

    //    funcPtr = &Test;

    funcPtr = reinterpret_cast<FuncPtr>(&Test);
    funcPtr();


    return 0;
}

上述代碼 Test 函數(shù)的返回類型是 int,而 FuncPtr 類型是 void(*)(),這兩者的返回類型不匹配,因此不能將 Test 函數(shù)指針直接賦給 funcPtr。可以通過reinterpret_cast 顯式類型轉(zhuǎn)換來解決這個問題,funcPtr = reinterpret_cast<FuncPtr>(&Test)Test 函數(shù)的指針轉(zhuǎn)換為 FuncPtr 類型的函數(shù)指針。

reinterpret_cast不進行類型檢查非常靈活,可以在不同指針類型之間進行轉(zhuǎn)換,包括將指針從對象類型轉(zhuǎn)換為其他類型,或者在整數(shù)類型和指針之間進行轉(zhuǎn)換。但是reinterpret_cast是非常危險的。因為他把這個檢查的大部分工作交給程序員自身來管理的,可能導致轉(zhuǎn)換不合理或不安全。

static_cast(靜態(tài)轉(zhuǎn)換)

static_cast(靜態(tài)轉(zhuǎn)換)可用于對基本類型進行轉(zhuǎn)換,例如int *轉(zhuǎn)double *,有繼承關系的類對象和類指針之間轉(zhuǎn)換。要注意的是,如果用static_cast做一個繼承關系的轉(zhuǎn)換,安全問題需要由程序員自身來保障。

比如說動物,它有一個類叫鴨子,那么鴨子它一定是一種動物,所以它有動物的行為。但是動物未必都有鴨子的行為,所以如果我們把鴨子轉(zhuǎn)換成動物,就是一個叫向上轉(zhuǎn)換的過程。如果向下轉(zhuǎn)換,那就是把動物轉(zhuǎn)換成鴨子。但并不是所有的動物都是鴨子,所以這個地方就存在一些潛在的危險。如果我們使用static_cast就不會發(fā)現(xiàn)這樣的問題。但如果我們使用dynamic_cast,就會幫我們檢查出來這種錯誤。

示例

class Base
{
public:
    Base() : _i(0) {}
    virtual void T() { cout << "Base:T" << _i << endl; }
private:
        int _i;
};
class Derived : public Base {
public:
    Derived() : _j(1) {}
    virtual void T() { cout << "Derived:T" << _j << endl; }
private:
    int _j;
};

void main() {
    int intValue = 5;
    double intValue2 = static_cast<double>(intValue);
    cout << intValue << " " << intValue2  << endl;//5 5                  

    double dValue = 5.6;
    int dValue2 = static_cast<int>(dValue);
    cout << dValue << " " << dValue2  << endl;//5.6 5  丟失精度

    Base base;
    Derived derived;

    Base* pBase;
    Derived* pDerived;
	// 父類--》子類  static_cast未做檢查 可能導致運行時錯誤
    pDerived = static_cast<Derived*>(&base);
    if (pDerived == NULL) {
        cout << "unsafe static cast from Base to Derived" << pDerived << endl;
    }
}

上面的static_cast將base轉(zhuǎn)化為Derived*,可能導致運行時錯誤。所以在進行類型轉(zhuǎn)換時,要注意類型匹配規(guī)則。確保轉(zhuǎn)換是安全的并且符合預期。例如,在進行向下轉(zhuǎn)型時,需要確保子類對象可以存儲父類對象。

dynamic_cast (動態(tài)轉(zhuǎn)換)

dynamic_cast (動態(tài)轉(zhuǎn)換)用于在類的繼承層次之間進行類型轉(zhuǎn)換,它既允許向上轉(zhuǎn)型,也允許向下轉(zhuǎn)型。向下轉(zhuǎn)型會進行檢測,如果轉(zhuǎn)換失敗則返回空指針或拋出std::bad_cast異常。用法如下:

dynamic_cast<new_type>(expression)

new_type 和 expression 必須同時是指針類型或者引用類型。

示例

class Base
{
public:
    Base() : _i(0) {}
    virtual void T() { cout << "Base:T" << _i << endl; }
private:
        int _i;
};
class Derived : public Base {
public:
    Derived() : _j(1) {}
    virtual void T() { cout << "Derived:T" << _j << endl; }
private:
    int _j;
};

void main() {

    Base base;
    Derived derived;

    Base* pBase;
    Derived* pDerived;
    
	// 父類--》子類  pDerived輸出NULL
    pDerived = dynamic_cast<Derived*>(&base);
    if (pDerived == NULL) {
        cout << "unsafe dynamic cast from Base to Derived" << endl;
    }
}

上述代碼創(chuàng)建了一個基類 Base 和一個派生類 Derived,然后通過dynamic_cast,將基類指針Base轉(zhuǎn)換為派生類指針 pDerived。,dynamic_cast 返回 NULL 表示轉(zhuǎn)換失敗。

在動態(tài)類型轉(zhuǎn)換中,只能將一個指向派生類對象的指針轉(zhuǎn)換為基類指針,而不是反過來。這是因為派生類對象包含了基類的部分,但反之并不成立。

如果想安全地將指向基類對象的指針轉(zhuǎn)換為指向派生類對象的指針,要確保對象實際上是派生類對象。

總結(jié)

const_cast

用于轉(zhuǎn)換指針或引用,去掉類型的const屬性;

reinterpret_cast

重新解釋類型,既不檢查指向的內(nèi)容,也不檢查指針類型本身;但要求轉(zhuǎn)換前后的類型所占用內(nèi)存大小一致,否則將引發(fā)編譯時錯誤。

static_cast

用于基本類型轉(zhuǎn)換,有繼承關系類對象和類指針之間轉(zhuǎn)換,由程序員來確保轉(zhuǎn)換是安全的,它不會產(chǎn)生動態(tài)轉(zhuǎn)換的類型安全檢查的開銷;

dynamic_cast

只能用于含有虛函數(shù)的類,必須用在多態(tài)體系中,用于類層次間的向上和向下轉(zhuǎn)化;向下轉(zhuǎn)化時,如果是非法的對于指針返回NULL;

到此這篇關于一文帶你探索C++中類型轉(zhuǎn)換的奧秘的文章就介紹到這了,更多相關C++類型轉(zhuǎn)換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++ 實現(xiàn)自定義類型的迭代器操作

    C++ 實現(xiàn)自定義類型的迭代器操作

    這篇文章主要介紹了C++ 實現(xiàn)自定義類型的迭代器操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • OpenCV實現(xiàn)霍夫變換直線檢測

    OpenCV實現(xiàn)霍夫變換直線檢測

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)霍夫變換直線檢測,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C++學習之異常機制詳解

    C++學習之異常機制詳解

    C++中的異常處理機制可以幫助我們處理程序在運行時可能會遇到的異常情況,比如內(nèi)存分配錯誤、文件打開失敗等。本文就和大家詳細講講C++中異常機制的具體使用吧
    2023-04-04
  • C++連接數(shù)據(jù)庫SqlServer、MySql、Oracle、Access、SQLite、PostgreSQL、MongoDB、Redis

    C++連接數(shù)據(jù)庫SqlServer、MySql、Oracle、Access、SQLite、PostgreSQL、Mong

    C++是一種通用的編程語言,可以使用不同的庫和驅(qū)動程序來連接各種數(shù)據(jù)庫,以下是一些示例代碼,演示如何使用?C++?連接?SQL?Server、MySQL、Oracle、ACCESS、SQLite?、?PostgreSQL、MongoDB、Redis數(shù)據(jù)庫
    2024-08-08
  • C++?OpenCV技術實戰(zhàn)之身份證離線識別

    C++?OpenCV技術實戰(zhàn)之身份證離線識別

    OpenCV身份證離線識別技術的主要技術就是通過OpenCV找到身份證號碼區(qū)域,然后通過OCR進行數(shù)字識別該區(qū)域的截圖即可得到身份證號碼。感興趣的可以了解一下
    2021-12-12
  • C語言中如何利用循環(huán)嵌套輸出一個菱形

    C語言中如何利用循環(huán)嵌套輸出一個菱形

    這篇文章主要介紹了C語言中如何利用循環(huán)嵌套輸出一個菱形問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • QT中在QLabel顯示圖片并且利用鼠標點擊畫線問題

    QT中在QLabel顯示圖片并且利用鼠標點擊畫線問題

    這篇文章主要介紹了QT中在QLabel顯示圖片并且利用鼠標點擊畫線問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C/C++ 格式說明符及其用法

    C/C++ 格式說明符及其用法

    在 C/C++ 中,格式說明符(Format Specifiers)主要用于 printf()、scanf() 等輸入輸出函數(shù)中,用于控制數(shù)據(jù)的格式化輸入和輸出,下面給大家介紹C/C++ 格式說明符及其用法,感興趣的朋友一起看看吧
    2025-05-05
  • C語言中的setlinebuf()、utmpname()、rewind函數(shù)使用

    C語言中的setlinebuf()、utmpname()、rewind函數(shù)使用

    這篇文章主要介紹了C語言中的setlinebuf()、utmpname()、rewind函數(shù)使用,是C語言中操作文件的一些基本函數(shù),需要的朋友可以參考下
    2015-08-08
  • C語言實現(xiàn)萬年歷源碼

    C語言實現(xiàn)萬年歷源碼

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)萬年歷源碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10

最新評論

万年县| 慈利县| 铜梁县| 临泽县| 邢台市| 晋州市| 历史| 思南县| 遂川县| 齐齐哈尔市| 江安县| 钟山县| 康平县| 玉林市| 朝阳县| 南漳县| 贡觉县| 阿合奇县| 平武县| 桑日县| 棋牌| 肇州县| 永兴县| 荣昌县| 铜梁县| 广水市| 江安县| 中山市| 柳州市| 嘉祥县| 清丰县| 定襄县| 永年县| 麻栗坡县| 游戏| 永靖县| 台湾省| 临高县| 华阴市| 辰溪县| 体育|