C++四种类型转换的关键字的使用

C 语言的强制类型转换形式
(type) expr;
但是这种旧式强制类型转换从表现形式上来说不够清晰明了,
容易看漏,一旦转换过程出现问题,追踪起来也就更加困难。
为了解决以上问题,C++不仅兼容了C的强制转换,来引入了新的转换方法。
C++新的强制类型转换的形式:
cast - name<type>(exper);
其中,type是转换的目标类型,exper是要转换的值,cast - name 有以下四种:
1. static_cast
2. dynamic_cast
3. const_cast
4. reinterpret_cast

接下来,我们逐个进行分析。
1、static_cast
这里先介绍下顶层const和底层const的概念:
(1)顶层const,表示指针本身是常量,例如:
int* const p1 = &i;
p1 = &j; //编译报错,不能修改p1指向
++(*p1); //可以,可以修改p1所指向的值的内容

(2)底层const,表示指针所指的对象是一个常量,例如:
const int* p2 = &i;
p2 = &j; //可以,可以修改p2的指向
++(*p2); //编译报错,不能修改p2所指向的值的内容

那么再来说说static_cast:任何具有明确定义的类型转换,除了不包含底层const,
都可以使用 static_cast。例如:
double d = 0.1;
void* p = &d;
double* dp = static_cast<double*>(p);
static_cast本质上是传统c语言强制转换的替代品。
通常,该操作符用于非多态类型的转换,任何标准转换都可以使用它。

2、dynamic_cast
用于将基类指针或引用安全的转换成派生类的指针或引用(运行时类型识别)。
dynamic_cast运算符的使用形式如下
dynamic_cast<type*>(e)
dynamic_cast<type&>(e)
dynamic_cast<type&&>(e)
其中,type必须是一个类类型,并且通常情况下该类型应该含有虚函数,
在第一种形式中,e必须是有效指针;在第二种形式中,e必须是一个左值,
在第三种形式中,e不能是左值。

如果转换目标是指针并且转换失败,则结果是0,如果转换目标是引用并且转换失败的,则会抛出异常。
因此,dynamic_cast操作符一次执行两个操作。首先验证被请求的转换是否有效,只有转换有效,操作符才实际进行转换。
【注意】dynamic_cast, 主要用于类层次间的转换:

上行转换(子类转父类),转换安全,成功返回类对象指针, 此时和static_cast 作用一样。

下行转换(父类转子类), 父类中要有虚函数,否则编译器报错。转换分几种情况:

a. 父类指针指向子类对象,转换安全, dynamic_cast返回类对象指针。

b.父类指针指向父类对象,转换不安全,dynamic_cast 返回nullptr。此时若使用static_cast, 返回非空指针,更不安全。

3、const_cast
只能用于改变运算对象的底层const(去掉const属性)
const char* p1;
char* p2 = const_cast<char*>(p1);
注意,我们去掉了const属性,编译器不会再阻止我们对该对象进行写操作,但要注意,通过p2写值是未定义行为。

4、reinterpret_cast
该操作符用于将一种类型转换为另一种不同的类型,
比如可以把一个指针类型转换为一个整数,再把整数转换为指针类型,并且还是原来那个指针。

“通常为运算对象的位模式提供较低层次上的重新解释“,即将变量以二进制形式被重新解释为新的类型,
这个操作本质是依赖于机器的,也就是说,还需要考虑移植性。要想安全的使用reinterpret_cast,
必须对涉及的类型和编译器实现转换的过程都非常了解。

reinterpret_casts 的最普通的用途,就是在函数指针类型之间进行转换。

简单总结
基本类型(非多态)的转换用static_cast。
多态类之间的类型转换用dynamic_cast。
去掉const属性用const_cast。
不同类型的指针类型转换用reinterpreter_cast。(慎用)
  

posted on   xcxfury001  阅读(155)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示