C语言中的类型转换
在C语言中的类型转换一般有一下几种
int i = 1;
double d = i;//隐式类型转换
int *p = &i;
int add = (int) p;//强制类型转换
但是这两种类型转换的可视性比较差,所有的转换形式都是以一种相同的形式书写,难以跟踪错误的转换。
为什么需要四种类型转换?
1.隐式类型转换有些情况下会出问题。
2.显示类型转换将所有情况混合在一起,代码不够清晰。
RTTI
运行时类型识别
1、typeid运算符
2、dynamic_cast运算符
C++强制类型转换
1.static_cast
static_cast用于非多态类型转换(静态转换),编译器隐式执行的任何类型转换都可用static_cast,但是它不能用于两个不相关类型转换,如不能转换const类型的数据,也不能将struct转换成char、int等类型。
double d = 12.34;
int a = static_cast<int> d;
2.const_cast
const_cast最常用的用途就是删除变量的const属性,方便赋值。
const int a = 1;
int *p = const_cast<int*>(&a);
3.reinterpret_cast
reinterpret_cast操作符通常为操作数的位模式提供较底层的重新解释,用于将一种类型转换成另一种不同的类型
1.在指针之间,将一个类型的指针转换为另一个类型的指针。
2.将指针转换一个整型数,但不能用于非指针类型的转换。
typedef void (*FUNC)();
int DoSomething(int i)
{
cout << "one" << endl;
return 0;
}
void Test()
{
FUNC f = reinterpret_cast<FUNC>(DoSomething);
f();
}
reinterpret_cast可以编译以FUNC的定义方式去看待DoSomething函数
C++不保证所有的函数指针都被一样的使用,所以这样用可能会产生不确定的结果。
4.dynamic_cast
与前三种类型转不同的地方是运行时类型识别。
dynamic_cast用于将一个父类对象的指针或引用转化为子类的指针或引用。
1、向上转换
将子类指针或引用转化为基类的指针或引用,更具赋值兼容规则不用转换直接赋值是安全的。
2、向下转换
用dynamic_cast基类对象指针转换为子类指针或引用都是安全的。
class A
{
public:
virtual void f(){}
};
class B
{};
void fun(A *pa)
{
B* pb = dynamic_cast<B*>(pa);
}
int main()
{
A a;
B b;
fun(&a);
fun(&b);
return 0;
}
注意:
1.dynamic_cast只能用于含有虚函数的类
2.dynamic_cast转化时先进行类型检测,成功则转换,如果失败,返回0.