四种转换的机制 :
static_cast
强制类型转换 所有编译器隐式执行的转换都可以由static_cast来转换
int a = 5;
float b = static_cast<float>(a);
效果类似于C风格代码的强制类型转换
int a = 5;
float b = (float)a;
要注意的是 static_cast不能进行指针类型的转换 除非是基类和派生类的转换
const_cast
去除变量的const属性 和C++11新增的mutable作用类似 都是为了突破const的限制
int b = 10;
const int* a = &b;
int *p = const_cast<int *>(a);
(*p)++;
a被const修饰且const在*的左边 所以a指向的区域是不可变的
经过const_cast转换后 p可以访问b 且可以修改b
dynamic_cast
基类指针转换到派生类指针 在runtime时发生的转换(其余都是编译时确定)
#include<iostream>
using namespace std;
class a {
public:
virtual void call() {
cout << "a cacll" << endl;
}
};
class b : public a {
public:
virtual void call() {
cout << "b call" << endl;
}
};
int main(int argc, char **argv)
{
a *a1 = new a();
a *a2 = new b();
b *b1 = dynamic_cast<b*>(a1);
b *b2 = dynamic_cast<b*>(a2);
b *b3 = static_cast<b*>(a1);
b *b4 = static_cast<b*>(a2);
cout << "b1 " << b1 << endl;
cout << "b2 " << b2 << endl;
cout << "b3 " << b3 << endl;
cout << "b4 " << b4 << endl;
delete a1;
delete a2;
return 0;
}
输出的结果
b1 0x0
b2 0x7feae9402a80
b3 0x7feae94006a0
b4 0x7feae9402a80
dynamic_cast是安全的转换 当转换失败时 返回空指针
static_cast转换不安全 有风险
reinterpret_cast
不同类型的转换 常见的是在指针和整数间做转换
int b = 10;
int *a = &b;
cout << "a " << a << endl;
long addr = reinterpret_cast<long>(a);
cout << "addr " << addr << endl;
int *c = reinterpret_cast<int *>(addr);
cout << "c " << c << endl;
JNI编程里这种做法很常见 将指针转换为long整形数 在java和c++之间传递
网友评论