c++类型转换
1. static_cast(静态类型转换)
基本语法:目标类型=static_cast<目标类型>(源类型)
- 用于基本数据类型之间的转换
- 把空指针转换成目标类型的空指针
- 把任何类型的表达式类型转换成void类型
- 用于类层次结构中父类和子类之间指针和引用的转换。
这边主要讲加粗的这两种情况以及转换的安全性
//语法: static_cast<目标类型>(待转换对象)
//基本数据类型转换
char a = 'A';
double c = static_cast<double>(a);
//父类转子类,下行转换,不安全可能访问越界
Base *b = new Base;
Son *s = static_cast<Son*>(b);
//子类转父类,上行转换,安全。
Son*s2 = new Son;
Base *b2 = static_cast<Base*>(s2);
//类型转换过程中并没有声明Base类和other类的继承关系,无法使用类型转换
/*other *other1 = new other;
Base *b3 = static_cast<Base*>(other1);*/
但是若发生多态则不论上下转换都是安全的,因为多态new出来的空间足够大,访问操作不会越界
2. dynamic_cast(动态类型转换)
基本语法:目标类型=dynamic_cast<目标类型>(源类型)
用法与静态的类似,但是更为严格,不能支持基本数据类型之间转换了,比如以下就会出错:
基本数据类型
char a = ‘A’;
double c = dynamic_cast(a);
//语法: dynamic_cast<目标类型>(待转换对象)
//基本数据类型转换,不支持
char a = 'A';
double c = dynamic_cast<double>(a);
//父类转子类,下行转换,不安全可能访问越界,不支持
Base *b = new Base;
Son *s = dynamic_cast<Son*>(b);
//子类转父类,上行转换,安全,支持
Son*s2 = new Son;
Base *b2 = dynamic_cast<Base*>(s2);
//类型转换过程中并没有声明Base类和other类的继承关系,无法使用类型转换,更不支持
/*other *other1 = new other;
Base *b3 = dynamic_cast<Base*>(other1);*/
同样的但是若发生多态则不论上下转换都是安全的,因为多态new出来的空间足够大,访问操作不会越界
C++中层次类型转换中无非两种:上行转换和下行转换
对于上行转换,static_cast和dynamic_cast效果一样,都安全;对于下行转换:你必须确定要转换的数据确实是目标类型的数据,即需要注意要转换的父类类型指针是否真的指向子类对象,如果是,static_cast和dynamic_cast都能成功;如果不是static_cast能返回,但是不安全,可能会出现访问越界错误,而dynamic_cast在运行时类型检查过程中,判定该过程不能转换,返回NULL。
3. const_cast(去const属性)
基本语法:目标类型=const_cast<目标类型>(源类型)
struct SA {
int i;
};
void main()
{
const SA ra;
SA &rb = const_cast<SA&>(ra);
rb.i = 10;
while (1)
{
}
}
4. reinterpret_cast(不相关类型的转换)
基本语法:目标类型=reinterpret_cast<目标类型>(源类型)
在上面的例子中,不相关类型使用static_cast是不可以转换的.
例如:
int p = static_cast<int*>(i);
但是可以通过reinterpret_cast来进行转换.
例如:
int* p = reinterpret_cast<int*>(i);
建议:尽量避免使用强制类型转换。
特别是在使用reinterpret_cast时,我们发现此类强制转换总是非常危险的。相似的,使用const_cast也总是预示着设计缺陷。static_cast与dynamic_cast也不应频繁使用。