强制类型转换
C++中有一套更安全的强制类型转换,分别是
1、静态类型转换
static_cast<目标类型>(源类型)
源类型和目标类型只要有一个方向可以隐式转换,那么两个方向都可以做静态类型转换,如果不能则报错
#include <iostream>
using namespace std;
int main(int argc,const char* argv[])
{
float num = 10;
cout << sizeof(static_cast<short>(num)) << endl;
int* p = NULL;
cout << static_cast<int>(p) << endl;
}
2、动态类型转换
dynamic_cast<目标类型>(源类型)
源类型和目标类型必须同是引用或指针,且目标类型和源类型之间存在继承关系,否则报错
#include <iostream>
using namespace std;
int main(int argc,const char* argv[])
{
int* p = NULL;
cout << dynamic_cast<long*>(p) << endl;
int num = 100;
cout << dynamic_cast<long>(num) << endl;
}
3、去常类型转换
const_cast<目标类型>(源类型)
源类型和目标类型必须同是引用或指针,且目标类型和源类型之间只有常属性的区别,否则报错
#include <iostream>
using namespace std;
int main(int argc,const char* argv[])
{
int* p = NULL;
cout << const_cast<const int*>(p) << endl;
cout << const_cast<long*>(p) << endl;
}
4、重解释类型转换
reinterpret_cast<目标类型>(源类型)
源类型和目标类型必须同是指针,或者一个指针一个整数,否则报错
#include <iostream>
using namespace std;
int main(int argc,const char* argv[])
{
cout << reinterpret_cast<int*>(100) << endl;
int* p = NULL;
cout << reinterpret_cast<int>(p) << endl;
cout << reinterpret_cast<short*>(p) << endl;
}
本贾尼·斯特劳斯特鲁普:如果让我重新设计,它们会更长。
原因:C++之父不希望程序员使用强制类型转换,如果程序中用到了强制类型转换则说程序设计的不完善,程序员应该去优化程序的设计而不应该强制类型转换。