C++11的类型转换
//C类型转换
/*
C语言:显式和隐式类型转换
- 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败
- 显式类型转化:需要用户自己处理.
隐式类型:界定:相关类型,相近类型,意义相似的类型 可以发生类型转换 ,
如整型和浮点可以发生类型转换,因为他们都表示数据的大小. 指针和整型不能发生,因为指针表示地址,和整型的意义不一样.
缺陷:
转换的可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误的转换
C语言的隐式类型转换的坑;
size_t 和 int (无符号和有符号):在vector 的 insert中体现 . 如size_t与int的变量有比较操作时会发生类型提升。当其中一个将要<0就会难以控制
*/
//C++为什么需要强制类型转换
/*
C++认为隐私类型转换不够好,最好就是不让隐私类型转换发生,于是引入了强制类型转换
C风格的转换格式很简单,但是有不少缺点的:
- 隐式类型转化有些情况下可能会出问题:比如数据精度丢失
- 显式类型转换将所有情况混合在一起,代码不够清晰
因此C++提出了自己的类型转化风格,注意因为C++要兼容C语言,所以C++中还可以使用C语言的
转化风格
*/
//C++强制类型转换
/*
标准C++为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符:
static_cast、reinterpret_cast、const_cast、dynamic_cast
1.static_cast
static_cast 对应 C语言的隐式类型转换(能当C语言的隐式类型转换使用)
用于非多态类型的转换(静态转换).编译器隐式执行的任何类型都可用. 但是不能用于两个不相关的类型进行转换
int main()
{
double d = 12.34;
int a = static_cast(d); // 意义相似,可以静态转换 ,仅丢失精度
std::cout << a << std::endl;
return 0;
}
2.reinterpret_cast -- 重新解释的转换 , 对应C语言的显式强制类型转换
reinterpret_cast 是重新解释的意思,进行一些不相关类型的转换
通常为操作数的位模式提供较低层次的重新解释,用于将一种类型转换为另一种不同的类型.
相关或相近类型不能使用reinterpret_cast.(会报错)
int main()
{
double d = 12.34;
int a = static_cast(d);
std::cout << a << std::endl;
// 这里使用static_cast会报错,应该使用reinterpret_cast
//int p = static_cast<int>(a);
int* p = reinterpret_cast<int>(a); //如C语言的强制类型转换,把int转化成int
return 0;
}
3.const_cast --- 去掉const的转换
const_cast最常用的用途就是删除变量的const属性,方便赋值.
通常要搭配volatile使用,因为编译器可能会把const变量当作宏来直接替换 或当作不再修改的变量放到寄存器.
( C语言通过指针进行强转是可以去掉const的 -- 不够规范)
int main()
{
volatile const int a = 2;
//int p = (int) &a;
int* p = const_cast<int*>(&a);
*p = 3;
std::cout << a << std::endl;
std::cout << *p << std::endl;
return 0 ;
}
4.dynamic_cast ---- 动态转换
多态知识:
赋值兼容规则
1.派生类的对象可以赋值给基类对象。
2.派生类的对象可以初始化基类的引用。
3.派生类对象的地址可以赋给指向基类的指针。
一般情况下,类型转换只支持指针和引用,对象不支持
父类是上,子类是下
赋值兼容规则天然支持 对象/指针/引用 下转上(子类转父类:切片)
即 "向上转型"
dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)
- dynamic_cast只能用于父类含有虚函数的类
- dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0
dynamic_cast: 安全的向下转型. 为什么安全?
向下转型只支持指针和引用
C语言强制向下转型是不安全的. 为什么?
// dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回nullptr
// 成功是指子类转子类. 失败是指子类转父类(越界)
因此,强转后只需要判断是否为空再使用,就能够保证安全
*/
// RTTI
/*
RTTI:Run - time Type identification的简称,即:运行时类型识别。
C++通过以下方式来支持RTTI:
- typeid运算符 //仅能获取类型的字符串
- dynamic_cast运算符 //也是类型识别,识别指针是指向父类还是指向子类
- decltyp
*/
C++11的类型转换的更多相关文章
- 《深入Java虚拟机学习笔记》- 第11章 类型转换
Java虚拟机包括许多进行基本类型转换工作的操作码,这些执行转换工作的操作码后面没有操作数,转换的值从栈顶断获得.Java虚拟机从栈顶端弹出一个值,对它进行转换,然后再把转换结果压入栈. int.lo ...
- C++11强制类型转换
C++ 强制类型转换有四种关键字:static_cast.const_cast.reinterpret_cast和dynamic_cast.它们用于不同的情况和目的,比C语言的强制类型转换更清晰和安全 ...
- 11条sql技巧
1. 负向条件查询不能使用索引 select * from order where status!=0 and stauts!=1 not in/not exists都不是好习惯 可以优化为in查询: ...
- C++基础知识易错点总结(1)
1. 在C++中,不能被重载的运算符有: sizeof . 成员运算符 .* 成员指针运算符 :: 作用域运算符 ?: 条件运算符 2. C++语言多态性:编译时多态和运行时多态: 编译时多态可通过函 ...
- Greenplum各种Tips(不定时更新)
Greenplum接触也有一段时间了,在使用过程中积累了一些命令,在此分享给大家. 1. 查看segment是否有切换(没有记录则没有切换) SELECT * from gp_segment_conf ...
- Data Base sqlServer基础知识
sqlServer 基础知识 大纲 创建数据库 1 创建表 2 备份表 3 删除表 4 修改表 5 查询出重复的数据 6 增删改查 7 添加约束 8 分页存储过程 9 排序 10 类型转换 11 ...
- 数往知来 SQL SERVER 基本语法<七>
sqlserver学习_01 启动数据库 开始->cmd->进入控制台 sqlcmd->-S .\sqlexpress 1> 如果出现表示数据库"sqle ...
- ### 学习《C++ Primer》- 9
Part 9: 模板与泛型编程(第16章) // @author: gr // @date: 2016-03-18 // @email: forgerui@gmail.com 1. 模板参数 类型模板 ...
- C++ Primer 5th 第4章 表达式
表达式是运算对象及运算符组成的式子,表达式求值将得到一个结果,单独的变量或者字面值也算表达式,结果是其本身. 运算符分为:一元运算符.二元运算符.三元运算符.一元即一个作用对象,二元两个作用对象,以此 ...
- Java虚拟机--字节码指令集
1. 字节码指令集简介: Java虚拟机的指令由一个字节长度的,代表着某种特定操作含义的操作码(Opcode)以及跟随其后的零至多个代表此操作所需参数的操作数(Operands)所构成.虚拟机中许多指 ...
随机推荐
- 领域知识图谱的医生推荐系统:利用BERT+CRF+BiLSTM的医疗实体识别,建立医学知识图谱,建立知识问答系统
领域知识图谱的医生推荐系统:利用BERT+CRF+BiLSTM的医疗实体识别,建立医学知识图谱,建立知识问答系统 本项目主要实现了疾病自诊和医生推荐两个功能并构建了医生服务指标评价体系.疾病自诊主要通 ...
- 3.2 IDAPro脚本IDC常用函数
IDA Pro内置的IDC脚本语言是一种灵活的.C语言风格的脚本语言,旨在帮助逆向工程师更轻松地进行反汇编和静态分析.IDC脚本语言支持变量.表达式.循环.分支.函数等C语言中的常见语法结构,并且还提 ...
- C/C++ 搜索缝隙并插入ShellCode
将ShellCode放入变量中,然后修改插入可执行文件名称,运行后即可将shellCode插入到EXE中,并设置好装载地址,程序运行后会先上线,然后在执行原始的代码,在使用metaspoit生成she ...
- C# 字符串转码后操作二进制文件
String转码后写入二进制文件,读二进制文件进行解码返回. public class BinaryClass { /// <summary> /// 写二进制文件 /// </su ...
- Windows 7 Ultimate with Service Pack 1 (x64)
Windows 7 Ultimate with Service Pack 1 (x64) 链接:https://pan.baidu.com/s/1ZHODDFlJPLQ3ydxZ4rfc3g 提取码: ...
- CH57x/CH58x/CH59x主从机主动发起断连
如果在做应用的时需要同时使用使用两块板子分别做主从机或者使用一块板子做单独的从机: 这是我们需要按下某个按键或者发送某条指令主机或者从机主动断开与对方的连接且设备不需要复位: 主机端我们可以调用这样一 ...
- MySQL 报错:ERROR 2002 (HY000): Can't connect to local MySQL server through socket
MySQL 报错:ERROR 2002 (HY000): Can't connect to local MySQL server through socket 一.错误现场还原: 下面我们通过三种方式 ...
- 致敬英雄,共悼逝者,css 让页面变黑白
壹 ❀ 引 今天是四月四日清明节,也是全国哀悼抗疫烈士的一天.细心的同学可以发现,不仅是娱乐活动以及游戏全部停止,当我们打开各大门户网站,网站页面也都变成了黑白,那么具体怎么做呢,这里可以借用CSS3 ...
- NC204418 新集合
题目链接 题目 题目描述 集合 \(s\) 中有整数 \(1\) 到 \(n\) ,牛牛想从中挑几个整数组成一个新的集合. 现在牛妹给牛牛加了 \(m\) 个限制 ,每个限制包含两个整数 \(u\) ...
- Reactive 简介
1. 概念 Reactive 非常适合低延迟.高吞吐量的工作负载. Reactive Processing 是一种范式(规范),它使开发人员能够构建非阻塞的.异步的应用程序,这些应用程序能够处理背压( ...