c++显式转换-笔记
来源:互联网 发布:手机粉碎软件 编辑:程序博客网 时间:2024/04/28 23:14
c++显示转换:static_cast、dynamic_cast、const_cast和reinterpret_cast
命名的强制类型转换符号的一般形式为:cast-name<type>(expression),其中cast-name为static_cast、dynamic_cast、const_cast和reinterpret_cast之一,type为转换的目标类型,expression为被强制转换的值
1、dynamic_cast:只用于对象的指针和引用,当用于多态类型时,它允许任意的隐式类型转换以及相反的过程,它可以将基类类型对象的引用或者指针转换成同一继承层次中其他类型的引用或者指针,和dynamic_cast一起使用的指针必须有效(必须为0或者指向一个对象),和其他强制类型转换不同的是 dynamic_cast 涉及运行时类型检查;如果绑定到引用或者指针的对象不是目标类型对象,则 dynamic_cast 失败,如果转换到指针类型的 dynamic_cast 失败,则 dynamic_cast 的结果是0值,如果转换到引用类型的 dynamic_cast 失败,则抛出一个 bad_cast 类型的异常;
dynamic_cast 操作符一次执行两个操作,它首先验证被请求的转换是否有效,只有转换有效,操作符才实际进行转换。一般引用或者指针所绑定的对象类型在编译时是未知的,基类的指针可以赋值为指向派生类对象,同样,基类的引用也可以用派生类的对象初始化,因此,dynamic_cast 操作符执行的验证必须在运行时进行
例:
Base 为至少带一个虚函数的基类, Derived 类为 Base 的派生类,一个指针 basePtr 指向 Base 基类,就可以在运行时进行强制转换为指向 Derived 的指针:
if(Derived *derivedPtr = dynamic_cast<Derived*>(basePtr))
{
}
else
{
}
运行时,如果 basePtr 实际指向 Derived 对象,则转换成功,否则转换结果为 0;
2、const_cast:转换掉表达式的 const 性质,除了添加和删除 const 特性,用 const_cast 符来执行其他任何类型转换,都会引起编译错误,对于常量表达式,试图使用其他三种转换类型都会导致错误;
如:const char *pc;
char *p = const_cast<char *>(pc)
3、static_cast:编译器隐式执行的任何类型转换都可以有 static_cast 显示完成;
4、reinterpret_cast:通常为操作数的位模式提供较低层次的重新解释,它本质上依赖于机器,为了安全地使用reinterpret_cast,要求程序员完全理解所涉及的数据类型,以及编译器实现强制类型转换的细节;
命名的强制类型转换符号的一般形式为:cast-name<type>(expression),其中cast-name为static_cast、dynamic_cast、const_cast和reinterpret_cast之一,type为转换的目标类型,expression为被强制转换的值
1、dynamic_cast:只用于对象的指针和引用,当用于多态类型时,它允许任意的隐式类型转换以及相反的过程,它可以将基类类型对象的引用或者指针转换成同一继承层次中其他类型的引用或者指针,和dynamic_cast一起使用的指针必须有效(必须为0或者指向一个对象),和其他强制类型转换不同的是 dynamic_cast 涉及运行时类型检查;如果绑定到引用或者指针的对象不是目标类型对象,则 dynamic_cast 失败,如果转换到指针类型的 dynamic_cast 失败,则 dynamic_cast 的结果是0值,如果转换到引用类型的 dynamic_cast 失败,则抛出一个 bad_cast 类型的异常;
dynamic_cast 操作符一次执行两个操作,它首先验证被请求的转换是否有效,只有转换有效,操作符才实际进行转换。一般引用或者指针所绑定的对象类型在编译时是未知的,基类的指针可以赋值为指向派生类对象,同样,基类的引用也可以用派生类的对象初始化,因此,dynamic_cast 操作符执行的验证必须在运行时进行
例:
Base 为至少带一个虚函数的基类, Derived 类为 Base 的派生类,一个指针 basePtr 指向 Base 基类,就可以在运行时进行强制转换为指向 Derived 的指针:
if(Derived *derivedPtr = dynamic_cast<Derived*>(basePtr))
{
}
else
{
}
运行时,如果 basePtr 实际指向 Derived 对象,则转换成功,否则转换结果为 0;
2、const_cast:转换掉表达式的 const 性质,除了添加和删除 const 特性,用 const_cast 符来执行其他任何类型转换,都会引起编译错误,对于常量表达式,试图使用其他三种转换类型都会导致错误;
如:const char *pc;
char *p = const_cast<char *>(pc)
3、static_cast:编译器隐式执行的任何类型转换都可以有 static_cast 显示完成;
4、reinterpret_cast:通常为操作数的位模式提供较低层次的重新解释,它本质上依赖于机器,为了安全地使用reinterpret_cast,要求程序员完全理解所涉及的数据类型,以及编译器实现强制类型转换的细节;
阅读全文
0 0
- c++显式转换-笔记
- 隐式转换与显式转换【C#】
- C学习笔记 10 字符串转换整数
- C/C++学习笔记28:类型转换
- C++primer学习笔记-----4.11类型转换
- c中数据类型的显式转换
- C/C++的显式类型转换
- c——显式类型转换
- C隐式类型转换
- C语言学习笔记03赋值类型转换
- 黑马程序员--C语言里的类型转换学习笔记
- 关于强制类型转换——《C专家编程》笔记
- 学习笔记------数据结构(C语言版)进制转换
- c语言学习笔记6之进制转换
- C学习笔记(三) 数据类型分类及类型转换
- C++primer阅读笔记-----------重载运算与类型转换
- 逆天的C++:显式类型转换
- [我眼中的C#]显式转换和隐式转换
- keil里中断服务函数设置标志位时加volatile
- Hibernate JPA —— Unable to find ... with id 0 错误
- JavaEE成长之路
- nginx 安装及,代理设置
- Kubernetes系统架构简介
- c++显式转换-笔记
- (转载)多线程编程学习三(线程间通信)
- 我眼中SEO的核心宗旨杂烩
- 32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数
- jQuery Mobile学习笔记(四)——列表
- Android 禁止下拉状态栏和底部导航栏的控制
- VC程序中关于堆栈大小的划定 .
- LeetCode-41-First Missing Positive 递归水题
- 【解决 FTP】windows访问Ubuntu的vsftpd(FTP服务器)问题200 Switching to ASCII mode,227 Entering Passive Mode (0,0,0