文章目录
类型强转的一般形式为:cast-name< type >(expression)
顶层const:指针本身是个常量;int * const p;
底层const:指针所指对象是个常量;
int const *p;
- static_cast(静态类型转换):只要不包括底层const,任何具有明确定义的类型转换都可以用,运行时不进行安全检查
- 可以用于类层次结构中基类与子类之间指针或引用的转换
把子类的指针或引用转换成基类表示是安全的,但把基类的指针或引用转换成子类指针或引用时,由于没有动态类型检查,所以是不安全的,因此基类与子类之间的动态类型转换建议用dynamic_cast
1.基本数据类型转换
2.把空指针转换成目标类型的空指针
3.把任何类型的表达式转换成void类型
4.static_cast不能去掉类型的const、volitale属性
5.static_cast不能进行无关类型指针之间的转换
int n = 6;
double d = static_cast<double>(n);
int *p=&n;
void *q = static_cast<void*>(p);
- const_cast(去const类型转换):只能改变底层的const
const_cast用来修改类型的const或volatile属性,会操纵传递对象的const属性,设置或移除该属性
去掉const属性:const_cast<int*> (&num),常用,因为不能把一个const变量直接赋给一个非const变量,必须要转换。
加上const属性:const int* k = const_cast<const int*>(j),一般很少用,因为可以把一个非const变量直接赋给一个const变量,比如:const int* k = j;
- reinterpret_cast(重新解释类型转换):
- 在指针之间进行转换,将一种类型的指针转换为另一种类型的指针
- 将指针转换为一个整型数,但不能用于非指针类型的转换
- dynamic_cast(动态类型转换):将基类的指针或引用转换为派生类的指针或引用,运行时进行安全检查
对指针进行dynamic_cast:失败null,成功返回正常cast后的对象指针
对引用进行dynamic_cast:失败抛出异常 bad_cast,成功返回正常cast后的对象指针
从派生类到基类,指针、引用都是安全的
从基类到派生类:基类指针所指对象是派生类类型,转换安全;基类指针所指对象为基类类型,dynamic_cast在运行时要检查,转换失败,返回结果0.
必须要有虚函数
BaseClass* pb =new DerivedClass();
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