C++11的四种强制类型转换

这篇具有很好参考价值的文章主要介绍了C++11的四种强制类型转换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

语法格式

static_cast(静态转换)

dynamic_cast(动态转换)

const_cast(常量转换)

 reinterpret_cast(重解释)


语法格式

cast-name <typename> (expression)

其中cast-namestatic_castdynamic_castconst_cast 和 reinterpret_cast之一,typename为需要转换的目标类型,而expression是被强制转换的值。

static_cast(静态转换)

1、父类到子类的转换,( 进行下行转换,把基类的指针或引用转换为派生类表示)不保证安全。

2、子类到父类的转换,(进行上行转换,把派生类的指针或引用转换成基类表示)保证安全。

3、基本数据类型之间的转换,是否正确需要开发人员来保证。

4、void 类型的空指针,转换成其他类型空指针。

5、可以把任何类型的表达式 转换为 void类型。

static_cast不能转换掉表达式的const、volitale属性。

ps:C++11的移动语义就是的底层实现就是这个

static_cast是直接不允许不同类型的引用进行转换的,因为没有void类型引用可以作为中间介质,这点和指针是有相当大区别的。

static_cast在进行下行转换的时候要子类要有父类的构造函数 不然static_cast会认为他们没有关联就会报错(这个时候会返回错误信息是安全的),这里由于上行转换是隐式类型转换所以不会报错

static的缺点就是:无法消除volitale,const的属性,无法直接对两个不同的类型指针或者引用进行转换(他的转换必须要经过void)还有下行转换没有安全检查

dynamic_cast(动态转换)

dynamic 支持运行指针时,识别指针类型或所引用的对象。

换句话说,它可以在执行期决定真正的类型,如果基类指针真的指向了子类对象,它便返回指子类对象的指针值,否则,则返回空指针。(所以说到底,他就是比static_cast多了个类型检查

1、其他三种都是编译时完成的,dynamic_cast是运行时处理的。

2、不能用于基本数据类型的转换。dynamic_cast只能对指针或引用进行强制转换

3、dynamic_cast转换如果成功的话返回的是指向类的指针或引用,转换失败的话则会返回NULL。

4、使用dynamic_cast进行下行转换,基类中一定要有虚函数,否则编译不通过,类中存在虚函数(满足多态),就说明它有想要让基类指针或引用指向派生类对象的情况,此时转换才有意义。需要有虚表的原因:类中存在虚表,就说明它有想要让基类指针或引用指向派生类对象的情况,dynamic_cast认为此时转换才有意义

5、在类的转换时,在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的。在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。

const_cast(常量转换)

const_cast用于强制去掉const或volitale 特性,但需要特别注意的是const_cast不是用于去除变量的常量性,而是去除指向常数对象的指针或引用的常量性,其去除常量性的对象必须为指针或引用,并且const_cast不支持不同类型指针或引用之间的转换

1、该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, type_id和expression的类型是一样的。

2、常量指针被转化成非常量指针,并且仍然指向原来的对象;

3、常量引用被转换成非常量引用,并且仍然指向原来的对象;

4、常量对象被转换成非常量对象。

ps: C++11里面的adressof 他是获取一个对象的实际地址 他的底层实现其实就是const_cast 去掉const 和 volatile 再用reinterpret_cast 加上 cosnt volatile 

 reinterpret_cast(重解释)

它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,再把该整数转换成原类型的指针,还可以得到原先的指针值)。
在使用reinterpret_cast强制转换过程仅仅只是比特位的拷贝,因此在使用过程中需要特别谨慎!

1、改变指针或引用的类型

2、将指针或引用转换为一个足够长度的整型

3、将整型转换为指针或引用类型

 文章来源地址https://www.toymoban.com/news/detail-668193.html

到了这里,关于C++11的四种强制类型转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java中的四种引用类型及其使用方式

    Java中有四种引用类型,分别是强引用(Strong Reference)、软引用(Soft Reference)、弱引用(WeakReference)、虚引用(PhantomReference)。 这要从Java管理内存的方式说起。Java为了将程序员从内存管理中解救出来,即不让程序员自己申请堆内存(比如C语言程序员需要通过malloc请求操作系统分配一

    2023年04月09日
    浏览(48)
  • 美团一面:说一说Java中的四种引用类型?

    在JDK1.2之前Java并没有提供软引用、弱引用和虚引用这些高级的引用类型。而是提供了一种基本的引用类型,称为 Reference 。并且当时Java中的对象只有两种状态:被引用和未被引用。当一个对象被引用时,它将一直存在于内存中,直到它不再被任何引用指向时,才会被垃圾回收

    2024年03月22日
    浏览(42)
  • 2023 - java - 强制类型转换和装箱

    强制类型转换和装箱: 在 Java 中, (Integer) 和 (int) 是两个不同的类型转换操作符,它们的效果是不一样的。 int a = (Integer) t.getContent(); 这条语句使用了装箱(Boxing)操作,将一个整数对象(Integer)转换为基本数据类型(int)。如果 t.getContent() 返回的是一个 Integer 对象,则它

    2024年02月11日
    浏览(36)
  • Java实现数据类型的强制转换

    在 Java 中,数据类型的强制转换可以使用小括号括起来的目标数据类型来实现。例如,要将一个 int 类型的变量强制转换为 double 类型,可以使用如下代码: 注意,强制转换可能会导致精度损失或溢出,因此应谨慎使用。 此外,Java 还提供了自动类型转换的机制,即在没有损

    2024年02月14日
    浏览(45)
  • java之“强制数据类型转换与数据溢出”

    本文以byte类型相加运算来做“强制数据类型转换与数据溢出”的示例。

    2024年02月04日
    浏览(47)
  • Java 强制类型转换原理(父类转子类、子类转父类)

    在Java中,对象的强制转换(也称为类型转换)是将一个对象的引用转换为另一个类的引用,前提是这两个类之间存在继承或实现关系。强制转换可能会导致运行时异常,因为在转换的过程中,如果对象的实际类型与转换的目标类型不兼容,就会抛出ClassCastException异常。 分析

    2024年02月07日
    浏览(36)
  • NAT的四种类型及类型检测

    考虑到UDP的无状态特性,目前针对其的NAT实现大致可分为Full Cone、Restricted Cone、Port Restricted Cone和Symmetric NAT四种。值得指出的是,对于TCP协议而言,一般来说,目前NAT中针对TCP的实现基本上是一致的,其间并不存在太大差异,这是因为TCP协议本身 便是面向连接的,因此无需考

    2024年02月07日
    浏览(39)
  • 检测数据类型的四种方法

    一、数据类型: 1、基本数据类型:String、Number、Boolean、Null、Undefined、Symbol 、BigInt 2、引用数据类型:Object、Array、Function、Date、RegExp 二、检测数据类型的四种方法 1.typeof检测   特点:typeof只能检测基本数据类型(除了null),不能准确的检测引用数据类型。 object、array、

    2024年02月15日
    浏览(45)
  • 【C/C++】C++ 四种强制转换

    C++ 中有四种强制转换方式,分别是: static_cast:用于基本数据类型之间的转换,以及具有继承关系的指针或引用之间的转换。static_cast 在编译时进行类型检查,如果转换不合法则会产生编译错误。 dynamic_cast:用于具有继承关系的指针或引用之间的转换,可以在运行时检查类

    2023年04月22日
    浏览(32)
  • POST请求中的四种数据类型

    为什么POST请求中会出现这些数据类型呢? 不同类型的数据用对应的编码格式效率比较高 便于数据校验 灵活性比较高 设定一些标准 Content-Type 包含三个指令: media type:声明传输数据的媒体类型( MIME ); charset:声明传输数据采用的是何种字符集; boundary:数据分界符,有

    2024年02月08日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包