一、C/C++ 中有哪些类型转换方式? 分别有什么区别?
1.隐式类型转换
适用于两个相关的类型之间的自动转换,类型不相关时编译器会识别出来并报错。
隐式类型转换的规则:
1.向长度增加的方向进行 以保证精度不降低
2.参与计算的数据类型不是同一种的时候 由简单向复杂进行转换
char->short->int->float->double
3.参与赋值语句计算 最终的类型是由赋值号左边类型决定的
double a = 3.14;
int b = a;//隐式类型转换 a 的值为 3
int* p = nullptr;
b = p;//两个不相关的类型无法进行隐式类型转换
2.强制类型转换
如果想让两个不相关之间的类型发生转换,此时需要显示的去强制类型转换。
int d = 3;
int *pd = nullptr;
d = (int)pd;//强制类型转换
3.C++ 中的类型转换
为了解决C语言类型的转换的问题,C++引入了四种命名的强制类型转换操作符。
1、static_cast
static_cast 用于非多态类型的转换,负责相关连的两个类型之间进行类型转换,与C语言中的隐式类型转换类似。
//static_cast
double d = 3.14;
int i = static_cast<int>(d); // 将 double 类型转换为 int
2.reinterpret_cast
reinterpret_cast 用于将任何指针类型转换成其他的指针类型,可能也包括指针与足够大的整数类型之间的转换。
// reinterpret_cast
int* p = new int(65);
char* ch = reinterpret_cast<char*>(p); // 将 int* 类型转换为 char* 类型
cout << *p;
3.const_cast
const_cast 用于去除变量的常属性,只能用于指针或者引用
const int a = 3; //常变量
int* pa = &a; //这样将a的地址赋值给pa是错的,因为a的地址是const int*类型
//此时可以采用const_cast 来进行强转
const int a = 3;
int* pa = const_cast<int*>(&a);//此时可以把const int* 转换成int*
4.dynamic_cast
用于类的多态类型的向上向下转换。
向上转换:子类向基类转换。
向下转换:基类向子类转换。
如果向下转换是安全的(也就说,如果基类指针或者引用确实指向一个派生类对象)这个运算符会传回适当转型过的指针。如果向下转换不安全,这个运算符会传回空指针(也就是说,基类指针或者引用没有指向一个派生类对象)
// dynamic_cast
class Base { virtual void dummy() {} };
class Derived : public Base{};
Base* b = new Derived();
Derived* d = dynamic_cast<Derived*>(b); //将 Base 类型指针转换为 Derived 类型指针
二、 类型转换可能会带来哪些问题?
隐式类型转换可能会导致数据精度丢失;
不当的类型转换还可能引发内存访问错误;
如果转换后的类型与实际需求不相符,可能会在后续的运算或操作中产生错误结果;
转换失败却没有进行适当的错误处理,程序可能会继续以错误的状态运行,带来更多难以排查的问题。