yo!这里是c++类型转换介绍

目录

前言

c语言的类型转换

c++类型转换

static_cast

reinterpret_cast

const_cast

dynamic_cast 

后记


前言

        在标准c++中,为了规范好类型转换的规则,对C语言中的类型转换进行了封装,也进行了丰富。正因如此,在面试过程中,面试官会关于这部分知识点进行提问,这一章节也是对这部分知识点进行尽可能全面地讲述,并从中重点强调易踩坑点,知识点并不是很多,但是不可不学的一部分。ok废话不多说,开讲。

c语言的类型转换

        在C语言中,如果遇到如下等情况:

①赋值运算符左右两侧类型不同;

②形参与实参类型不匹配;

③返回值类型与接收返回值类型不一致,

就需要发生类型转化。总共有两种形式的类型转换,包括隐式类型转换显式的强制类型转换

隐式类型转换:编译器在编译阶段自动进行,意义相近的可以转,不相近的会编译失败,比如char和int之间可以转、int与double之间可以转、int与int*之间不可以转;

显式类型转换:用户处理,适合转化意义不相近但转后有意义的的两种类型。

eg:

yo!这里是c++类型转换介绍_第1张图片

c++类型转换

        C语言使用两种方式将所有类型转换的情况都混合在一起,代码不够清晰,c++对以上类型转换方式做了严格的区分,并且作为面向对象的语言,对自定义类型之间的转换也做了相关介绍。

        c++提出了四种强制类型转换操作符,包括static_cast、reinterpret_cast、const_cast、dynamic_cast,下面对此具体介绍。值得提一嘴的是,c++兼容c,所以上面c语言的类型转换方式还是可以使用的。

  • static_cast

        static_cast用于相关类型之间的转换(静态转换),替代了C语言的隐式类型转换,C语言中可以用隐式类型转换的的任何类型转换都可用static_cast,但它不能用于两个不相关的类型进行转换

eg:

yo!这里是c++类型转换介绍_第2张图片

  • reinterpret_cast

        reinterpret_cast顾名思义,重新解释,是将一种类型转化为另一种类型,替代C语言的强制类型转换,可用于不相关类型之间

eg:

  • const_cast

        const_cast用于转换带有const属性的类型为另一种类型,最常用的用途是删除一个变量的const属性,以使其可以赋值。

eg:

yo!这里是c++类型转换介绍_第3张图片

         在上面的例子中,i是有const属性的,所以打印出来还是1没有变化,很正常,p是由i强制类型转换而来的int指针变量,修改后打印出来是2也很正常,但是如下图,在vs的监视窗口中可以看到,i和*p的值都是2这是怎么回事?

        这是因为编译器优化后的结果,打印i是认为i带有属性const,默认i一直为2(不从内存中拿随时修改的新数据,而是从寄存器中拿),若将i定义成volatile const int i=1;,如下图看结果。

结果:

yo!这里是c++类型转换介绍_第4张图片

  • dynamic_cast 

        在多态的学习中,我们知道,子类的指针/引用可以赋值给父类的指针/引用,这是一种切片操作,也叫做向上转型,这个过程不属于类型转换,属于赋值兼容的规则。相应地,存在向下转型的概念,即父类指针/引用赋值给子类指针/引用。听到这里,下意识地会想问这个过程中,子类多出来的对象该怎么办呢?但其实并不是这样,是在一定的场景下才能用,具体可以看下面的例子。继续说向下转型,这个转换的过程需要使用到dynamic_cast,dynamic_cast用于将一个父类的指针/引用转换为子类的指针或引用(动态转换),使用注意以下两点:

①dynamic_cast只能用于父类含有虚函数的类;

②dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0

        比如说下面这个例子,函数f的参数父类指针pa可以接收父类指针可以接收子类指针,主函数中分别传进父类指针和子类指针,可以看到,使用dynamic_cast类型转换,pa并不是指向子类指针,所以转换失败,而使用c语言的强转发现并不安全,存在越界访问;当pa指向的是子类指针时,两种类型转换都可以拿到其中的数据。总的来说,dynamic_cast比较安全,转换失败时会返回空指针/0。

eg:

yo!这里是c++类型转换介绍_第5张图片

        值得注意的是上面例子中使用dynamic_cast的场景,要想使用dynamic_cast将父类指针/引用赋值给子类指针/引用,就必须保证原本父类的指针/引用指向的并不是父类对象,而是子类对象,此时将这个父类指针/引用赋值给子类指针/引用就可以使用dynamic_cast这个安全的类型转换。

后记

        从以上的学习中可以发现,c++类型转换只是对c语言中的类型转换进行了分类包装,对相关部分进行了规范,从学习角度来说这部分知识点并不难,但是还是当作专题了解一下,特别是dynamic_cast的学习,与c++多态的知识点相联系,一旦牵扯到多态,怕是会称为大多数同学学习c++路上的绊脚石。总体来说,c++类型转换知识点不是特别复杂,值得大家深入学习一波,有问题举手,拜拜!


你可能感兴趣的:(cpp,c++,开发语言,后端,职场和发展,面试,笔记,学习方法)