C++四种类型转换
2017-08-15 19:49
260 查看
const_cast
主要用于删除变量的const属性,便于赋值const int a = 2; int* p = const_cast<int*>(&a ); *p = 3;
reinterpret_cast
仅仅是重新解释类型,没有二进制的转化,主要用于:指针,整数之间的互相转化
在指针类型(尤其是函数指针)之间进行转换
int *ip; char *pc = reinterpret_cast<char*>(ip);
依赖于硬件,移植性很差,很少使用。
static_cast
主要用于基本类型的转换,如int转double等基类和子类之间转换:其中子类指针转换成父类指针是安全的;但父类指针转换成子类指针是不安全的。(基类和子类之间的动态类型转换建议用dynamic_cast)
把空指针转换成目标类型的空指针
PS:
相比于C语言的直接转换,static_cast具有编译时期的类型检查机制,同时可读性好,便于查错。
B,C类型无关 C* pc = (C*) new B;//可以编译通过 C* pc = static_cast<C*>(new B); //编译错误!!!
dynamic_cast
有条件转换,动态类型转换,运行时类型安全检查(转换失败返回NULL):安全的基类和子类之间转换.
向上转型:子类对象指针->父类指针/引用(不需要转换)
向下转型:父类对象指针->子类指针/引用(用dynamic_cast转型是安全的)
dynamic_cast只能用于含有虚函数的类
相同基类不同子类之间的交叉转换,但结果是NULL。dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回NULL
为何使用dynamic_cast转换类指针时,需要虚函数呢。
Dynamic_cast转换是在运行时进行转换,运行时转换就需要知道类对象的信息(继承关系等)。
如何在运行时获取到这个信息——虚函数表。
C++对象模型中,对象实例最前面的就是虚函数表指针,
通过这个指针可以获取到该类对象的所有虚函数,包括父类的。
因为派生类会继承基类的虚函数表,所以通过这个虚函数表,我们就可以知道该类对象的父类,在转换的时候就可以用来判断对象有无继承关系。
所以虚函数对于正确的基类指针转换为子类指针是非常重要的。
DerivedClass *pd1 = static_cast<DerivedClass *>(pb); //子类->父类,静态类型转换,正确但不推荐 DerivedClass *pd2 = dynamic_cast<DerivedClass *>(pb); //子类->父类,动态类型转换,正确 BaseClass* pb2 = new BaseClass(); DerivedClass *pd21 = static_cast<DerivedClass *>(pb2); //父类->子类,静态类型转换,危险!访问子类m_szName成员越界 DerivedClass *pd22 = dynamic_cast<DerivedClass *>(pb2); //父类->子类,动态类型转换,安全的。结果是NULL
相关文章推荐
- C/C++中四种不同的类型转换方式
- c++中四种类型转换
- c++中主要有四种强制转换类型运算…
- C++的四种cast操作符的区别--类型转换
- C++/面试 - 四种类型转换(cast)的关键字 详解 及 代码
- 面试系列 --- c++四种类型转换
- C++的四种cast操作符的区别--类型转换
- C++中四种类型转换static_cast、const_cast、reinterpret_cast、dynamic_cast
- 分享:C++中四种类型转换运算符的使用方法
- C++四种基本类型转换
- 从零开始学C++之从C到C++(二):引用、内联函数inline、四种类型转换运算符
- C++中四种类型转换方式
- c++中四种类型转换
- 面试总结(二)转 C++的四种cast操作符的区别--类型转换
- 标准c++中四种强制转换类型运算符介绍 const_cast,reinterpret_cast,static_cast,dynamic_cast
- C++中四种类型转换方式
- C++中四种类型转换方式
- C++中的四种显式类型转换之static_cast
- C++中的四种强制类型的转换
- C++中四种类型转换方式