C++ - 类型转换 static_cast, dynamic_cast, reinterpret_cast, const_cast
来源:互联网 发布:linux编译4.13内核步骤 编辑:程序博客网 时间:2024/05/17 06:58
-- static_cast
用于类层次结构中基类和子类之间转换。(基类和子类之间的转换通常建议用dynamic_cast)
进行上行转换(把子类的指针转换成基类)是安全的;
进行下行转换(把基类的指针转换成子类)时,由于没有动态类型检查,所以是不安全的。
用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
-- dynamic_cast
用于类层次结构中基类和子类之间的转换
进行上行转换(把子类的指针转换成基类)时, dynamic_cast和static_cast的效果是一样的;
进行下行转换(把基类的指针转换成子类)时, dynamic_cast具有类型检查的功能,
比static_cast更安全。但是要求类必须有虚函数表, 这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表。
所以在进行类的:
上行转换时, static_cast和dynamic_cast是一样的, 都是安全的
下行转换时, static_cast是不安全的; dynamic_cast是安全的, 但是要求基类包含虚函数表。
相同父类的子类之间进行转换, static_cast和dynamic_cast都是不可以的
static_cast:直接编译就报错
dynamic_cast: 如果没有虚函数表, 就直接编译报错
: 如果有虚函数表, 编译不报错, 但是转换后的值是NULL
-- const_cast
常量指针被转化成非常量指针
class A
{
public:
int i;
};
int main(int argc, char *argv[])
{
A * a = new A();
a->i = 10;
const A * b = const_cast<A *>(a);
//b->i = 10; // compile error "The left operand cannot be assigned to."
A * c = const_cast<A *>(b);
c->i = 10;
}
-- reinterpret_cast
随你怎么解释, 举个例子
可以看到reinterpert_cast<>可以成功, 剩下的static_cast和dynamic_cast都不能成功。
但是reinterpert_cast非常危险, 举个例子如果父类不含虚函数, 而子类含有虚函数, 那么这两个类不能用reinterpert_cast进行转换
执行输出结果如下:
c1->a=1, c1->b=2
c2->a=1, c2->b=2, c2->c=3
c3->a=2
c4->a=137256
可以看出(c3,c4)上行和下行的转换都是失败的。
如果用C2 *c3 = (C2 *)(c1);转换, 上行下行都是成功的, 即能正确输出值1.
dd
- 【C++】强制类型转换(static_cast,reinterpret_cast,const_cast,dynamic_cast,explicit)
- [C++] 强制类型转换static_cast、dynamic_cast、reinterpret_cast和const_cast
- c++dynamic_cast、const_cast 、static_cast、reinterpret_cast强制类型转换
- static_cast dynamic_cast const_cast reinterpret_cast 类型转换
- C++ - 类型转换 static_cast, dynamic_cast, reinterpret_cast, const_cast
- 类型转换static_cast dynamic_cast const_cast reinterpret_cast
- static_cast, const_cast, dynamic_cast, 和reinterpret_cast 类型转换
- static_cast、dynamic_cast、reinterpret_cast和const_cast 类型转换
- C++类型转换 static_cast, dynamic_cast, reinterpret_cast, const_cast
- C++类型转换:static_cast、const_cast、dynamic_cast、reinterpret_cast
- C++类型转换 static_cast、dynamic_cast、const_cast、reinterpret_cast
- C++类型转换: static_cast const_cast reinterpret_cast dynamic_cast
- 类型转换-static_cast、dynamic_cast、reinterpret_cast、const_cast探讨
- reinterpret_cast,static_cast,dynamic_cast,const_cast类型转换
- xxx_cast类型转换static_cast/const_cast/reinterpret_cast/dynamic_cast
- 强制类型转换 static_cast、dynamic_cast、reinterpret_cast、和const_cast
- c++ 强制转换类型运算符 const_cast reinterpret_cast static_cast dynamic_cast
- 标准C++的类型转换:static_cast、dynamic_cast、reinterpret_cast、和const_cast
- 大学课程设计
- CWinApp 应用程序类
- ORACLE数据库备份与恢复详解
- 堆组织表(heap organized table)
- JQuery和IHttpHandler实现自动提示功能(转)
- C++ - 类型转换 static_cast, dynamic_cast, reinterpret_cast, const_cast
- CentOS 5.3安装过程中的问题
- Flex通信篇——Flex键盘组合键
- Linux Modify Host's Ip Address
- C# 中获取应用程序路径的方法(集合)
- 每月3亿PV的FaceBook朋友买卖插件的架构与数据
- Linux高性能集群 - 资源管理和系统管理
- 主次设备编号
- JCR概念篇