//C类型转换

/*

C语言:显式和隐式类型转换

  1. 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败
  2. 显式类型转化:需要用户自己处理.

隐式类型:界定:相关类型,相近类型,意义相似的类型 可以发生类型转换 ,

如整型和浮点可以发生类型转换,因为他们都表示数据的大小. 指针和整型不能发生,因为指针表示地址,和整型的意义不一样.

缺陷:

转换的可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误的转换

C语言的隐式类型转换的坑;

size_t 和 int (无符号和有符号):在vector 的 insert中体现 . 如size_t与int的变量有比较操作时会发生类型提升。当其中一个将要<0就会难以控制

*/

//C++为什么需要强制类型转换

/*

C++认为隐私类型转换不够好,最好就是不让隐私类型转换发生,于是引入了强制类型转换

C风格的转换格式很简单,但是有不少缺点的:

  1. 隐式类型转化有些情况下可能会出问题:比如数据精度丢失
  2. 显式类型转换将所有情况混合在一起,代码不够清晰

    因此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用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)

  1. dynamic_cast只能用于父类含有虚函数的类
  2. dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0

dynamic_cast: 安全的向下转型. 为什么安全?

向下转型只支持指针和引用

C语言强制向下转型是不安全的. 为什么?

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

// 成功是指子类转子类. 失败是指子类转父类(越界)

因此,强转后只需要判断是否为空再使用,就能够保证安全

*/

// RTTI

/*

RTTI:Run - time Type identification的简称,即:运行时类型识别。

C++通过以下方式来支持RTTI:

  1. typeid运算符 //仅能获取类型的字符串
  2. dynamic_cast运算符 //也是类型识别,识别指针是指向父类还是指向子类
  3. decltyp

*/

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

  1. 《深入Java虚拟机学习笔记》- 第11章 类型转换

    Java虚拟机包括许多进行基本类型转换工作的操作码,这些执行转换工作的操作码后面没有操作数,转换的值从栈顶断获得.Java虚拟机从栈顶端弹出一个值,对它进行转换,然后再把转换结果压入栈. int.lo ...

  2. C++11强制类型转换

    C++ 强制类型转换有四种关键字:static_cast.const_cast.reinterpret_cast和dynamic_cast.它们用于不同的情况和目的,比C语言的强制类型转换更清晰和安全 ...

  3. 11条sql技巧

    1. 负向条件查询不能使用索引 select * from order where status!=0 and stauts!=1 not in/not exists都不是好习惯 可以优化为in查询: ...

  4. C++基础知识易错点总结(1)

    1. 在C++中,不能被重载的运算符有: sizeof . 成员运算符 .* 成员指针运算符 :: 作用域运算符 ?: 条件运算符 2. C++语言多态性:编译时多态和运行时多态: 编译时多态可通过函 ...

  5. Greenplum各种Tips(不定时更新)

    Greenplum接触也有一段时间了,在使用过程中积累了一些命令,在此分享给大家. 1. 查看segment是否有切换(没有记录则没有切换) SELECT * from gp_segment_conf ...

  6. Data Base sqlServer基础知识

    sqlServer   基础知识 大纲 创建数据库 1 创建表 2 备份表 3 删除表 4 修改表 5 查询出重复的数据 6 增删改查 7 添加约束 8 分页存储过程 9 排序 10 类型转换 11 ...

  7. 数往知来 SQL SERVER 基本语法<七>

    sqlserver学习_01 启动数据库 开始->cmd->进入控制台    sqlcmd->-S .\sqlexpress    1> 如果出现表示数据库"sqle ...

  8. ### 学习《C++ Primer》- 9

    Part 9: 模板与泛型编程(第16章) // @author: gr // @date: 2016-03-18 // @email: forgerui@gmail.com 1. 模板参数 类型模板 ...

  9. C++ Primer 5th 第4章 表达式

    表达式是运算对象及运算符组成的式子,表达式求值将得到一个结果,单独的变量或者字面值也算表达式,结果是其本身. 运算符分为:一元运算符.二元运算符.三元运算符.一元即一个作用对象,二元两个作用对象,以此 ...

  10. Java虚拟机--字节码指令集

    1. 字节码指令集简介: Java虚拟机的指令由一个字节长度的,代表着某种特定操作含义的操作码(Opcode)以及跟随其后的零至多个代表此操作所需参数的操作数(Operands)所构成.虚拟机中许多指 ...

随机推荐

  1. vue在render函数中如何实现v-model和事件绑定(4)

    1.h函数的三个参数 第一个参数是必须的. 类型:{String | Object | Function} 一个 HTML 标签名.一个组件.一个异步组件.或一个函数式组件. 是要渲染的html标签. ...

  2. vm-storage在全部都是旧metric情况下的写入性能测试

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 接上篇:测试所有metric都是存在过的metric的情况 ...

  3. 【解决了一个小问题】vm-select中的`search.maxUniqueTimeseries`参数比vm-storage中的参数更大导致的问题

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 为了让vm查询更大的数据范围,修改了vm-select的参 ...

  4. 【K哥爬虫普法】大数据风控第一案:从魔蝎科技案件判决,看爬虫技术刑事边界

    我国目前并未出台专门针对网络爬虫技术的法律规范,但在司法实践中,相关判决已屡见不鲜,K 哥特设了"K哥爬虫普法"专栏,本栏目通过对真实案例的分析,旨在提高广大爬虫工程师的法律意识, ...

  5. NLP文本匹配任务Text Matching 有监督训练:PointWise(单塔)、DSSM(双塔)、Sentence BERT(双塔)项目实践

    NLP文本匹配任务Text Matching [有监督训练]:PointWise(单塔).DSSM(双塔).Sentence BERT(双塔)项目实践 0 背景介绍以及相关概念 本项目对3种常用的文本 ...

  6. 驱动开发:WinDBG 配置内核双机调试

    WinDBG 是在windows平台下,强大的用户态和内核态调试工具,相比较于Visual Studio它是一个轻量级的调试工具,所谓轻量级指的是它的安装文件大小较小,但是其调试功能却比VS更为强大, ...

  7. Windows XP Professional with Service Pack 3 (x86)

    Windows XP Professional with Service Pack 3 (x86) 链接:https://pan.baidu.com/s/1p99vLx5psoq9K4ONlRpkZA ...

  8. 从CPU100%高危故障到稳定在10%:一个月的优化之旅,成功上线!

    引言 经过三个月的开发,项目通过了所有测试并上线,然而,我们发现项目的首页几乎无法打开,后台一直发生超时错误,导致CPU过度负荷.在这次项目开发过程中,我制定了一份详细的技术优化方案.考虑到客户无法提 ...

  9. uni-uadmin后台管理系统|uniapp+uView跨端后台框架实例

    基于uniapp+uview+uni-ui跨平台手机端后台管理系统UniappUAdmin. uniapp-uadmin 基于uni-app+uView+uniUI研发的跨端手机后台管理系统项目.全新 ...

  10. 案例:记录一则强制开库遭遇ORA-16433的处理过程

    客户的一套开发环境,大概了解到的背景是清理空间时redo被运维人员当作log误删除,一线同事先接手处理,过程中遇到问题升级到我这里继续分析. 接手后,数据库处于mount状态,之前恢复过程中已经做过r ...