C++11强制类型转换
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强制类型转换的更多相关文章
- python小白——进阶之路——day3天-———容器类型数据+Number类型强制类型转换
-->Number 部分 int : 整型 浮点型 布尔类型 纯数字字符串 float: 整型 浮点型 布尔类型 纯数字字符串 complex: 整型 浮点型 布 ...
- python 基础之自动类型转换和强制类型转换
一:自动类型转换 自动类型转换注意针对Number数据类型来说的 当2个不同类型的数据进行运算的时候,默认向更高精度转换 数据类型精度从低到高:bool int float complex #关于bo ...
- java的强制类型转换
java强制类型转换 详细连接https://www.cnblogs.com/kuangwong/p/6198862.html 在Java项目的实际开发和应用中,常常需要用到将对象转为String这 ...
- C++之强制类型转换
C++ Code 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 ...
- JAVA强制类型转换(转载+自己的感想) - stemon
JAVA强制类型转换(转载+自己的感想) - stemon 时间 2013-10-29 15:52:00 博客园-Java原文 http://www.cnblogs.com/stemon/p/33 ...
- 强制类型转换(int)、(int&)和(int*)的区别
我们先来看两行代码: float x=1.75,y=1.75; cout<<(int)x<<" "<<(int&)y<<en ...
- js字符串转换为数字的三种方法。(转换函数)(强制类型转换)(利用js变量弱类型转换)
js字符串转换为数字的三种方法.(转换函数)(强制类型转换)(利用js变量弱类型转换) 一.总结 js字符串转换为数字的三种方法(parseInt("1234blue"))(Num ...
- javascript的强制类型转换
1.toString (1)调用toString方法 Array是将数组中的每个元素字符串化,并使用逗号拼接起来 object返回的是内部属性[[Class]]的值,[object Object] n ...
- javascript之强制类型转换
在javascript中,常会发生强制类型转换的情况有以下几种 字符串拼接 var a = 1; var b = a + '1'; console.log(b); //11 ==运算符 var a = ...
- 【C++】 四种强制类型转换(static_cast 与 dynamic_cast 的区别!)
强制类型转换 1. static_cast 2. dynamic_cast 3. const_cast 4. reinterpret_cast 5. 为什么要需要四种类型转换? 1. static_c ...
随机推荐
- ajax的重新学习,以及axios
首先在这次学习之前已经又过了简单的入门,并且在上学期vue的开发中对其中的ajax语法以及方法有所认识,但是还有很多别的框架不同种的写法,因此我需要掌握原生ajax的知识 一.对ajax的简单认识 a ...
- 字符节点流--> 桥装换流
输出 存值 用法1创建字节输出节点流FileOutputStream fos = new FileOutputStream("存入文件的路径");2创建桥转换流,按照指定的字符编码 ...
- Vue3 向window注入方法 TS警告 元素隐式具有 "any" 类型,因为索引表达式的类型不为 "number" 问题解决。
window['funcName'] = function(){}; // 'funcName'会标红警告 (window as any).funcName = function(){}; // 正确 ...
- Java压缩音频视频工具类
/** * TODO * * @author Administrator * @version 1.0 * @date 2021/11/5 16:55 */ public class vedio { ...
- gdb调试数组访问越界记录
综述 问题来源于力扣的一道域名访问统计题目,我本想以建立首字母索引的方式去统计,但是在申请子域名buffer的地方发现使用malloc(sizeof(char)4)申请出来的buffer每次+1只能增 ...
- 2021.06.21 onmouseover和onmouseleave事件对比
在重新巩固js基础的过程中,分别使用onmouseover和onmouseleave事件却导致了不同的效果,但是在之前的记忆中,这两者确实是一样的哈,因此探究一下产生不同效果的原因. 在使用onmou ...
- vs2019升级到16.8编译报razortaghelper 任务意外失败的错误
为了体验.net 5,把vs升级到了最新版本16.8,然后编译原来的项目(.net core 2.2),报了以下错误: 解决方法如下: 删除C:\Program Files\dotnet\sdk\Nu ...
- DataX Web可视化分布式调度数据同步系统
因项目需要,结合目前参与的项目,以及个人技术能力范围,组合研发一套web可视化数据同步系统,正式名称:DataXP. 项目背景:接触过阿里云这类大数据平台,对于中大型项目以及需要与外部系统对接数据的情 ...
- 关于office 16
word是office的组件之一,Excel也是其中之一. 一用有八大组件.
- classload加载机制
BootstrapClassLoader.ExtClassLoader.AppClassLoader实际是查阅相应的环境属性sun.boot.class.path.java.ext.dirs和java ...