【每日 C/C++ 问题】

一、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 类型指针

二、 类型转换可能会带来哪些问题?

        隐式类型转换可能会导致数据精度丢失;

        不当的类型转换还可能引发内存访问错误;

        如果转换后的类型与实际需求不相符,可能会在后续的运算或操作中产生错误结果;

        转换失败却没有进行适当的错误处理,程序可能会继续以错误的状态运行,带来更多难以排查的问题。

上一篇:Java学习Day61:薄纱王灵官!(Nginx review)