c++ 之 类型转换

Posted sxgloverr1314

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ 之 类型转换相关的知识,希望对你有一定的参考价值。

一、隐式类型转换

int m = 3 + 45.6; //48.6000000000 截断为48,将小数部分进行截断

二、C风格 显式类型转换(强制类型转换)

//int k = 5 % 3.2; 编译器报错

int k = 5 %(int)3.2; //C语言风格的强制类型转换,但需要程序员来保证数据正确可转
int k = 5 % int(3.2); //函数风格的强制类型转换(C语言风格的强制类型转换中的一种)
int k = 5 %(int)"dddd"; //C语言风格的强制类型转换,但结果肯定错误
//所以C语言风格的强制类型转换是一种不安全的类型强制转换

三、C++类型转换

//C++出来支持C风格的类型转换,但提供4中C++的强制类型转换,分别用于不同的目的

//目的是为了提供丰富的含义和功能,更好的类型检查机制,方便代码的书写与维护
1.static_cast
2.dynamic_cast
3.const_cast
4.reinterpret_cast

这四种强制类型转换被称为 "命名的强制类型转换"
1.static_cast:静态转换(可以理解为C风格的强制类型转换,但编译器会检查其合法性)
//通用形式

//强制类型转换名<type>(express);1.static_cast:静态转换(可以理解为C风格的强制类型转
换,但编译器会检查其合法性)
  可用于
    a.相关类型的转换(如浮点型转整型)
    int i = static_cast<int> 100.0;
b.子类转换为父类(继承关系)
c.void *指针与其他指针之间的转换(被强制转换的是void *类型指针)
  不可用于
   a.一般不能用于不同类型指针之间的转换
2.dynamic_cast:主要应用于 运行时类型识别与检查。
主要用来父类型和子类型之间的转换用(将父类型指针指向子类型对象)

3.const_cast:去除指针或引用的const属性(编译时进行类型转换)不能进行不同类型之间的转换

4.reinterpret_cast:重新解释(处理无关类型的转换)可以乱转,安全性较差
  常用于如下两种类型的转换
a.将整型转换为指针
b.将一种类型的指针转换为另一种类型的指针。
c.指针转换为整型

四、总结

1.强制类型转换均不建议使用,会抑制编译器报错

2. reinterpret_cast非常危险,const_cast使用则意味着设计缺陷

3. 如果实在需要进行强制类型转换,则要使用C++风格的强制类型转换

4. reinterpret_cast只要合乎规则的使用,则很好用

以上是关于c++ 之 类型转换的主要内容,如果未能解决你的问题,请参考以下文章

C++ 介绍⁽⁴⁾|C++ 类型转换

C++ 数据类型转换

C++ 或 Java 中的类型转换和类型转换有啥区别?

c++中的类型转换

C++的类型转换

C++从青铜到王者第二十四篇:C++的类型转换