C语言的类型转换
在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与
接收返回值类型不一致时,就需要发生类型转化。
int main()
{
double d = 1.1;
//隐式类型转换
int i = d;
//显示类型转换
int* pi = (int*)&d;
return 0;
}
上面这种转换的缺陷会造成精度缺失,及转换类型不明确等问题,因此C++新定义了一套转换风格
C++强制类型转换
以下为C++4种强制类型转换操作符
static_cast、reinterpret_cast、const_cast、dynamic_cast
static_cast
static_cast用于非多态类型的转换(静态转换),编译器隐式执行的任何类型转换都可用
static_cast,但它不能用于两个不相关的类型进行转换
int main()
{
double d = 1.1;
int a = static_cast<int>(d);
//编译报错 两个不相关的类型就不能进行类型转换
int* pi = static_cast<int*>(&d);
return 0;
}
reinterpret_cast
reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释,用于将一种类型转换
为另一种不同的类型
int main()
{
double d = 1.1;
int a = static_cast<int>(d);
//不建议这样使用
int* pi = reinterpret_cast<int*>(&d);
return 0;
}
const_cast
const_cast最常用的用途就是删除变量的const属性,方便赋值
int main()
{
const int a = 2;
int* p = const_cast<int*>(&a);
*p = 3;
return 0;
}
dynamic_cast
dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)
注意:
- dynamic_cast只能用于父类含有虚函数的类
- dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0
class A
{
public:
virtual void f() {}
};
class B : public A
{};
//当我们传参数时,不知道pa是指向父类还是子类
//dynamic_cast能帮助我们分辨
void fun(A* pa)
{
B* ptr = dynamic_cast<B*>(pa);
if (ptr)
{
cout << "转换成功" << ptr << endl;
}
else
{
cout << "转换失败" << ptr << endl;
}
}
int main()
{
A a;
B b;
fun(&a);
fun(&b);
return 0;
}