C++ 强制类型转换有四种关键字:static_cast、const_cast、reinterpret_cast和dynamic_cast。它们用于不同的情况和目的,比C语言的强制类型转换更清晰和安全。static_cast用于数据类型和继承关系类间的明确定义的转换,const_cast用于去掉或加上底层const,reinterpret_cast用于低级别的指针或整数的转换,dynamic_cast用于多态类间的转换.

static_cast

  • 基本使用:int a; static_cast<double>(a)

  • 使用范围:一般用于数据类型得强制转换,此外:

    • 基类与派生类(上行转换,派生-->基类,下行转换不安全)
    • 空指针转化为目标类型指针
    • 任何类型表达法转为void类型

const_cast

强制去掉不能被修改的常数特性(只能是指针或引用,而不能是变量数值)

尽量不要使用。

const int a = 10;

const int * p = &a;

int *q;

q = const_cast<int *>(p);

reinterpret_cast

使用范围:

  • 改变指针引用类型:

    int *a = new int;
    double *d = reinterpret_cast<double *>(a);
  • 整型与指针引用类型的相互转换

dynamic_cast

特点:运行时转换,需要做类型检查

范围:

  • 不能用于内置的基本数据类型的强制转换(static_cast)

  • 成功的话返回的是指向类的指针或引用,转换失败的话则会返回NULL

  • 使用dynamic_cast进行转换的,基类中一定要有虚函数,否则编译不通过.类中存在虚函数,就说明它有想要让基类指针或引用指向派生类对象的情况,此时转换才有意义.这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表.只有定义了虚函数的类才有虚函数表。

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

如下程序:

class Base{
void fun_a();
virtual void fun_b(); // 必须有一个虚函数才能被使用动态强制转换
}
class Derived:public Base{
void fun_c();
}
int main(){
Derived *p = new Base(); // error
Derived *p = static_cast<derived *>(new base); // compile true, but run error
p->fun_c();
Derived *p = dynamic_cast<derived *>(new base); // compile true, and p is NULL because call for function c not existed in Base class.
p->fun_c();
return 0;
}

C++11强制类型转换的更多相关文章

  1. python小白——进阶之路——day3天-———容器类型数据+Number类型强制类型转换

    -->Number 部分 int :     整型   浮点型 布尔类型  纯数字字符串 float:    整型   浮点型 布尔类型  纯数字字符串 complex:  整型   浮点型 布 ...

  2. python 基础之自动类型转换和强制类型转换

    一:自动类型转换 自动类型转换注意针对Number数据类型来说的 当2个不同类型的数据进行运算的时候,默认向更高精度转换 数据类型精度从低到高:bool int float complex #关于bo ...

  3. java的强制类型转换

    java强制类型转换  详细连接https://www.cnblogs.com/kuangwong/p/6198862.html 在Java项目的实际开发和应用中,常常需要用到将对象转为String这 ...

  4. C++之强制类型转换

     C++ Code  12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 ...

  5. JAVA强制类型转换(转载+自己的感想) - stemon

    JAVA强制类型转换(转载+自己的感想) - stemon 时间 2013-10-29 15:52:00  博客园-Java原文  http://www.cnblogs.com/stemon/p/33 ...

  6. 强制类型转换(int)、(int&)和(int*)的区别

    我们先来看两行代码: float x=1.75,y=1.75; cout<<(int)x<<" "<<(int&)y<<en ...

  7. js字符串转换为数字的三种方法。(转换函数)(强制类型转换)(利用js变量弱类型转换)

    js字符串转换为数字的三种方法.(转换函数)(强制类型转换)(利用js变量弱类型转换) 一.总结 js字符串转换为数字的三种方法(parseInt("1234blue"))(Num ...

  8. javascript的强制类型转换

    1.toString (1)调用toString方法 Array是将数组中的每个元素字符串化,并使用逗号拼接起来 object返回的是内部属性[[Class]]的值,[object Object] n ...

  9. javascript之强制类型转换

    在javascript中,常会发生强制类型转换的情况有以下几种 字符串拼接 var a = 1; var b = a + '1'; console.log(b); //11 ==运算符 var a = ...

  10. 【C++】 四种强制类型转换(static_cast 与 dynamic_cast 的区别!)

    强制类型转换 1. static_cast 2. dynamic_cast 3. const_cast 4. reinterpret_cast 5. 为什么要需要四种类型转换? 1. static_c ...

随机推荐

  1. ajax的重新学习,以及axios

    首先在这次学习之前已经又过了简单的入门,并且在上学期vue的开发中对其中的ajax语法以及方法有所认识,但是还有很多别的框架不同种的写法,因此我需要掌握原生ajax的知识 一.对ajax的简单认识 a ...

  2. 字符节点流--> 桥装换流

    输出 存值 用法1创建字节输出节点流FileOutputStream fos = new FileOutputStream("存入文件的路径");2创建桥转换流,按照指定的字符编码 ...

  3. Vue3 向window注入方法 TS警告 元素隐式具有 "any" 类型,因为索引表达式的类型不为 "number" 问题解决。

    window['funcName'] = function(){}; // 'funcName'会标红警告 (window as any).funcName = function(){}; // 正确 ...

  4. Java压缩音频视频工具类

    /** * TODO * * @author Administrator * @version 1.0 * @date 2021/11/5 16:55 */ public class vedio { ...

  5. gdb调试数组访问越界记录

    综述 问题来源于力扣的一道域名访问统计题目,我本想以建立首字母索引的方式去统计,但是在申请子域名buffer的地方发现使用malloc(sizeof(char)4)申请出来的buffer每次+1只能增 ...

  6. 2021.06.21 onmouseover和onmouseleave事件对比

    在重新巩固js基础的过程中,分别使用onmouseover和onmouseleave事件却导致了不同的效果,但是在之前的记忆中,这两者确实是一样的哈,因此探究一下产生不同效果的原因. 在使用onmou ...

  7. vs2019升级到16.8编译报razortaghelper 任务意外失败的错误

    为了体验.net 5,把vs升级到了最新版本16.8,然后编译原来的项目(.net core 2.2),报了以下错误: 解决方法如下: 删除C:\Program Files\dotnet\sdk\Nu ...

  8. DataX Web可视化分布式调度数据同步系统

    因项目需要,结合目前参与的项目,以及个人技术能力范围,组合研发一套web可视化数据同步系统,正式名称:DataXP. 项目背景:接触过阿里云这类大数据平台,对于中大型项目以及需要与外部系统对接数据的情 ...

  9. 关于office 16

    word是office的组件之一,Excel也是其中之一. 一用有八大组件.  

  10. classload加载机制

    BootstrapClassLoader.ExtClassLoader.AppClassLoader实际是查阅相应的环境属性sun.boot.class.path.java.ext.dirs和java ...