C++迭代器和显示类型转换方式

 更新时间:2024年04月23日 10:10:23   作者:csdn_HZW  
这篇文章主要介绍了C++迭代器和显示类型转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

1.迭代器

其实迭代器很简单,没有我们想象中的那么复杂。

以前要读写数据结构中的数据,一般是通过移动指针来进行的,但是在编写指针的过程中难免会出现野指针等情况出现,而且指针用起来也相对复杂。

这时候,神奇的迭代器出现了。

迭代器是指针的一个泛化,在容器和算法之间充当桥梁的作用。

区别于指针,迭代器本身重载的“++”和“–”操作符,能够直接指向前驱和后继节点。

2.显式类型转换

将一种类型转换成另一种类型,在程序中很常见,转换后的类型变量,它的内部存储方式一般也随之改变。

C++提供了四种显式的类型转换操作函数reinterpret_cast、const_cast、static_cast和dynamic_cast。

前三个类型的转换是在编译的时候进行类型转换,最后一个则是在运行的时候进行类型转换,并可返回转换成功与否的标志。

2.1 reinterpret_cast

**reinterpret_cast类型转换函数将一个类型的指针转换为另一个类型的指针。

**这种转换不用修改指针变量值数据存放格式(不改变指针变量的值),也不能把const指针转换成void*指针,只需在编译时重新解释指针的类型就行。

double d = 9.3;
    double *pd = &d;
    int *pi = reinterpret_cast<int* >(pd);  //相当于隐式转换int *pi = (int*)pd;
    class A{};
    class B{};
    A *pa = new A;
    B *pb = reinterpret_cast<B* >(pa);        //相当于隐式转换B* pb = (B* )pa;
    long j = reinterpret_cast<long>(pi);      //相当于long j = (long)pi;

2.2const_cast

const_cast用于去除指针变量的常量属性,将它转换为一个对应指针类型的普通变量,反过来也成立。

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

const_cast只是针对于指针操作,无法将非指针的常变量转换为普通变量。

    int* pi = 0;
    const int* pcj = const_cast<const int* >(pi);//将普通指针转换为常量指针
    int i=0;
    const int cj = const_cast<const int>(i);//非指针转换为const指针,不能通过编译!
    const int ck = (const int)i;//隐式转换,可通过编译

2.3 static_cast

static_cast一般用于基本类型之间和具有继承关系之间的类型转换,这种转换一般会更改变量的内部表示方式。

一般不用于指针类型转换。

    int i = 0;
    double d = static_cast<double>(i);//将i的int型转换为double型然后赋值给d;
    int j = static_cast<int>(j); //将double型转换为int 型然后赋值给j;
    class Base{};
    class Derived:Base{};
    Derived d;
    Base b = static_cast<Base>(d);//将子类对象d转换为父类然后赋值给b;

2.4 dynamic_cast 

与上面三个不同,dynamic_cast是在运行的时候进行转换分析的,上面三个是在编译时进行。

dynamic_cast只能在继承类对象的指针之间或引用之间进行类型转换。

进行转换时,会根据当前运行对象的运行时类型信息,判断类型对象之间是否转换合法。

dynamic_cast的指针转换失败,可通过是否为null指针检测;引用转换失败则抛出一个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转化为父类指针pb
    Derived* pd = new Derived;
    Base* pb = dynamic_cast<Base* >(pd);
    if(!pb)
    {
        cout << "类型转换失败" << endl;
    }
    else
    {
        cout << "类型转换成功" << endl;
    }
    //子类引用转化为父类引用
    Derived d;
    Base& b = dynamic_cast<Base& >(d);
    //没有继承关系,但被转化的类有虚函数
    class A{
        virtual ~A(){}
    };
    class B{};
    A* pa = new A;
    B* pc = dynamic_cast<B* >(pa);//有虚函数的对象指针,可以转化
    if(!pc)
    {
        cout << "类型转换成功" << endl;
    }
    else
    {
        cout << "类型转换失败" << endl;
    }
    return a.exec();
}

运行结果:

dynamic_cast不只是应用于类型转换,**通常利用它做运行时对象类型检查的特性,在程序中检测当前内存对象的类型信息,**以决定下一步操作,使程序更灵活机动。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • c语言 数据存储与原码 反码 补码详细解析

    c语言 数据存储与原码 反码 补码详细解析

    不知道你是否和我一样好奇,学习编程语言的同时想,各个数据类型是怎样在我们的内存中储存的呢,如果你仔细深入了解的话,你会了解其中的乐趣,了解科学家们的伟大,了解c语言
    2022-02-02
  • 详解C++中常用的四种类型转换方式

    详解C++中常用的四种类型转换方式

    这篇文章主要为大家详细介绍了C++中常用的四种类型转换方式:static_cast<Type>、dynamic_cast<Type>、const_case<Type>和reinterpret_cast,感兴趣的可以了解一下
    2022-08-08
  • C语言实现扫雷程序

    C语言实现扫雷程序

    这篇文章主要为大家详细介绍了C语言实现扫雷程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • VS2017+Qt5+Opencv3.4调用摄像头拍照并存储

    VS2017+Qt5+Opencv3.4调用摄像头拍照并存储

    本文主要介绍了VS2017+Qt5+Opencv3.4调用摄像头拍照并存储,实现了视频,拍照,保存这三个功能。具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • C语言学习之函数知识总结

    C语言学习之函数知识总结

    函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。本文就为大家详细讲讲C语言中函数的相关知识点,希望有所帮助
    2022-07-07
  • C语言二叉树的遍历示例介绍

    C语言二叉树的遍历示例介绍

    大家好,本篇文章主要讲的是C语言二叉树的遍历示例介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01
  • Linux中rm命令使用以及C/C++代码实现

    Linux中rm命令使用以及C/C++代码实现

    m 是remove 的缩写,Linux中 rm 命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除,这篇文章主要给大家介绍了关于Linux中rm命令使用以及C/C++代码实现的相关资料,需要的朋友可以参考下
    2022-04-04
  • C++与Lua交互原理实例详解

    C++与Lua交互原理实例详解

    这篇文章主要介绍了C++与Lua交互原理实例详解,有感兴趣的同学可以研究下
    2021-02-02
  • C++实现优先队列的示例详解

    C++实现优先队列的示例详解

    普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。本文将用C++实现优先队列,需要的可以参考一下
    2022-06-06
  • 常用的C语言编程工具汇总

    常用的C语言编程工具汇总

    c语言编程软件适于编写系统软件,是学习编程的同学们的必备软件。c语言一种非常强大的计算机语言,应用非常广泛,不仅仅是在软件开发上,而且各类科研都会用到c语言。今天小编给大家汇总下C语言的编程工具
    2018-01-01

最新评论