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

C++迭代器和顯示類型轉(zhuǎn)換方式

 更新時間:2024年04月23日 10:10:23   作者:csdn_HZW  
這篇文章主要介紹了C++迭代器和顯示類型轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

1.迭代器

其實迭代器很簡單,沒有我們想象中的那么復(fù)雜。

以前要讀寫數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù),一般是通過移動指針來進(jìn)行的,但是在編寫指針的過程中難免會出現(xiàn)野指針等情況出現(xiàn),而且指針用起來也相對復(fù)雜。

這時候,神奇的迭代器出現(xiàn)了。

迭代器是指針的一個泛化,在容器和算法之間充當(dāng)橋梁的作用。

區(qū)別于指針,迭代器本身重載的“++”和“–”操作符,能夠直接指向前驅(qū)和后繼節(jié)點。

2.顯式類型轉(zhuǎn)換

將一種類型轉(zhuǎn)換成另一種類型,在程序中很常見,轉(zhuǎn)換后的類型變量,它的內(nèi)部存儲方式一般也隨之改變。

C++提供了四種顯式的類型轉(zhuǎn)換操作函數(shù)reinterpret_cast、const_cast、static_cast和dynamic_cast。

前三個類型的轉(zhuǎn)換是在編譯的時候進(jìn)行類型轉(zhuǎn)換,最后一個則是在運(yùn)行的時候進(jìn)行類型轉(zhuǎn)換,并可返回轉(zhuǎn)換成功與否的標(biāo)志。

2.1 reinterpret_cast

**reinterpret_cast類型轉(zhuǎn)換函數(shù)將一個類型的指針轉(zhuǎn)換為另一個類型的指針。

**這種轉(zhuǎn)換不用修改指針變量值數(shù)據(jù)存放格式(不改變指針變量的值),也不能把const指針轉(zhuǎn)換成void*指針,只需在編譯時重新解釋指針的類型就行。

double d = 9.3;
    double *pd = &d;
    int *pi = reinterpret_cast<int* >(pd);  //相當(dāng)于隱式轉(zhuǎn)換int *pi = (int*)pd;
    class A{};
    class B{};
    A *pa = new A;
    B *pb = reinterpret_cast<B* >(pa);        //相當(dāng)于隱式轉(zhuǎn)換B* pb = (B* )pa;
    long j = reinterpret_cast<long>(pi);      //相當(dāng)于long j = (long)pi;

2.2const_cast

const_cast用于去除指針變量的常量屬性,將它轉(zhuǎn)換為一個對應(yīng)指針類型的普通變量,反過來也成立。

    const int* pci =0;
    int *pj = const_cast<int *>(pci);    //相當(dāng)于int* pj = (int*)pci;
    const A* pca = new A;
    A* pa = const_cast<A*>(pca);    //相當(dāng)于A* pa = (A*)pca;

const_cast只是針對于指針操作,無法將非指針的常變量轉(zhuǎn)換為普通變量。

    int* pi = 0;
    const int* pcj = const_cast<const int* >(pi);//將普通指針轉(zhuǎn)換為常量指針
    int i=0;
    const int cj = const_cast<const int>(i);//非指針轉(zhuǎn)換為const指針,不能通過編譯!
    const int ck = (const int)i;//隱式轉(zhuǎn)換,可通過編譯

2.3 static_cast

static_cast一般用于基本類型之間和具有繼承關(guān)系之間的類型轉(zhuǎn)換,這種轉(zhuǎn)換一般會更改變量的內(nèi)部表示方式。

一般不用于指針類型轉(zhuǎn)換。

    int i = 0;
    double d = static_cast<double>(i);//將i的int型轉(zhuǎn)換為double型然后賦值給d;
    int j = static_cast<int>(j); //將double型轉(zhuǎn)換為int 型然后賦值給j;
    class Base{};
    class Derived:Base{};
    Derived d;
    Base b = static_cast<Base>(d);//將子類對象d轉(zhuǎn)換為父類然后賦值給b;

2.4 dynamic_cast 

與上面三個不同,dynamic_cast是在運(yùn)行的時候進(jìn)行轉(zhuǎn)換分析的,上面三個是在編譯時進(jìn)行。

dynamic_cast只能在繼承類對象的指針之間或引用之間進(jìn)行類型轉(zhuǎn)換。

進(jìn)行轉(zhuǎn)換時,會根據(jù)當(dāng)前運(yùn)行對象的運(yùn)行時類型信息,判斷類型對象之間是否轉(zhuǎn)換合法。

dynamic_cast的指針轉(zhuǎn)換失敗,可通過是否為null指針檢測;引用轉(zhuǎn)換失敗則拋出一個bad_cast異常。

#include <QCoreApplication>
#include <iostream>
#include<stdio.h>
#include<typeinfo.h>
using namespace std;
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    class Base{};
    class Derived:public Base{};
    //子類指針pd轉(zhuǎn)化為父類指針pb
    Derived* pd = new Derived;
    Base* pb = dynamic_cast<Base* >(pd);
    if(!pb)
    {
        cout << "類型轉(zhuǎn)換失敗" << endl;
    }
    else
    {
        cout << "類型轉(zhuǎn)換成功" << endl;
    }
    //子類引用轉(zhuǎn)化為父類引用
    Derived d;
    Base& b = dynamic_cast<Base& >(d);
    //沒有繼承關(guān)系,但被轉(zhuǎn)化的類有虛函數(shù)
    class A{
        virtual ~A(){}
    };
    class B{};
    A* pa = new A;
    B* pc = dynamic_cast<B* >(pa);//有虛函數(shù)的對象指針,可以轉(zhuǎn)化
    if(!pc)
    {
        cout << "類型轉(zhuǎn)換成功" << endl;
    }
    else
    {
        cout << "類型轉(zhuǎn)換失敗" << endl;
    }
    return a.exec();
}

運(yùn)行結(jié)果:

dynamic_cast不只是應(yīng)用于類型轉(zhuǎn)換,**通常利用它做運(yùn)行時對象類型檢查的特性,在程序中檢測當(dāng)前內(nèi)存對象的類型信息,**以決定下一步操作,使程序更靈活機(jī)動。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • c語言?數(shù)據(jù)存儲與原碼?反碼?補(bǔ)碼詳細(xì)解析

    c語言?數(shù)據(jù)存儲與原碼?反碼?補(bǔ)碼詳細(xì)解析

    不知道你是否和我一樣好奇,學(xué)習(xí)編程語言的同時想,各個數(shù)據(jù)類型是怎樣在我們的內(nèi)存中儲存的呢,如果你仔細(xì)深入了解的話,你會了解其中的樂趣,了解科學(xué)家們的偉大,了解c語言
    2022-02-02
  • 詳解C++中常用的四種類型轉(zhuǎn)換方式

    詳解C++中常用的四種類型轉(zhuǎn)換方式

    這篇文章主要為大家詳細(xì)介紹了C++中常用的四種類型轉(zhuǎn)換方式:static_cast<Type>、dynamic_cast<Type>、const_case<Type>和reinterpret_cast,感興趣的可以了解一下
    2022-08-08
  • C語言實現(xiàn)掃雷程序

    C語言實現(xiàn)掃雷程序

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)掃雷程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • VS2017+Qt5+Opencv3.4調(diào)用攝像頭拍照并存儲

    VS2017+Qt5+Opencv3.4調(diào)用攝像頭拍照并存儲

    本文主要介紹了VS2017+Qt5+Opencv3.4調(diào)用攝像頭拍照并存儲,實現(xiàn)了視頻,拍照,保存這三個功能。具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • C語言學(xué)習(xí)之函數(shù)知識總結(jié)

    C語言學(xué)習(xí)之函數(shù)知識總結(jié)

    函數(shù)是一組一起執(zhí)行一個任務(wù)的語句。每個?C?程序都至少有一個函數(shù),即主函數(shù)?main()?,所有簡單的程序都可以定義其他額外的函數(shù)。本文就為大家詳細(xì)講講C語言中函數(shù)的相關(guān)知識點,希望有所幫助
    2022-07-07
  • C語言二叉樹的遍歷示例介紹

    C語言二叉樹的遍歷示例介紹

    大家好,本篇文章主要講的是C語言二叉樹的遍歷示例介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • Linux中rm命令使用以及C/C++代碼實現(xiàn)

    Linux中rm命令使用以及C/C++代碼實現(xiàn)

    m 是remove 的縮寫,Linux中 rm 命令的功能為刪除一個目錄中的一個或多個文件或目錄,它也可以將某個目錄及其下的所有文件及子目錄均刪除,這篇文章主要給大家介紹了關(guān)于Linux中rm命令使用以及C/C++代碼實現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • C++與Lua交互原理實例詳解

    C++與Lua交互原理實例詳解

    這篇文章主要介紹了C++與Lua交互原理實例詳解,有感興趣的同學(xué)可以研究下
    2021-02-02
  • C++實現(xiàn)優(yōu)先隊列的示例詳解

    C++實現(xiàn)優(yōu)先隊列的示例詳解

    普通的隊列是一種先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),元素在隊列尾追加,而從隊列頭刪除。在優(yōu)先隊列中,元素被賦予優(yōu)先級。本文將用C++實現(xiàn)優(yōu)先隊列,需要的可以參考一下
    2022-06-06
  • 常用的C語言編程工具匯總

    常用的C語言編程工具匯總

    c語言編程軟件適于編寫系統(tǒng)軟件,是學(xué)習(xí)編程的同學(xué)們的必備軟件。c語言一種非常強(qiáng)大的計算機(jī)語言,應(yīng)用非常廣泛,不僅僅是在軟件開發(fā)上,而且各類科研都會用到c語言。今天小編給大家匯總下C語言的編程工具
    2018-01-01

最新評論