【C++】类型转换_c++数组的类型转换
1.C++的类型转换
1.1C语言中类型转换
如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化
有以下两种形式:
1.隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败
2.显式类型转化:需要用户自己处理
缺点:转换的可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误的转换
end会被隐式类型转化为size_t,数组下标通常用无符号整型表示,发生整数提升,由于size_t 不能表示负数所以int在转换时会发生数据丢失,会去掉二进制符号位的表示,当pos为0时这个结束条件就无效造成无限循环,因为int的负数转换过来会很大而0是size_t中最小的表示
1.2 为什么C++需要四种类型转换
C风格的转换格式很简单,但是有不少缺点的:
- 隐式类型转化有些情况下可能会出问题:比如数据精度丢失
- 显式类型转换将所有情况混合在一起,代码不够清晰
因此C++提出了自己的类型转化风格,注意因为C++要兼容C语言,所以C++中还可以使用C语言的转化风格。
1.3C++强制类型转换
标准C++为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符:
volatile
转换有安全隐患的场景:
强转之后通过指针变量可以修改常变量n,但n还是不变。在打印时编译器会进行优化,不去内存中取,因为cpu在执行指令时访问内存比较慢,一般将变量放到寄存器或直接宏替换。
所以通过打印结果和调试发现n值不同,监视窗口不是编译指令会直接去内存中取n值,而打印语句会到寄存器中取或直接替换了注意:
这里n是常变量,常变量一般不可以直接修改,可以间接修改和常量的区别是常变量开了空间
加上volite关键字修饰,去掉常变量的常性,使用或打印时每次都要到内存取
const的变量不加关键字每次修改是从寄存器取或者直接宏替换,加了之后就只能从内存中取
static_cast
1.用于非多态类型的转换(静态转换,指在编译时确定的类型转换),以及在类层次结构中向上转型(从派生类指向基类)。
2.编译器隐式执行的任何类型转换都可用,但它不能用于两个不相关的类型进行转换
3.这种转换是在编译时检查的,如果转换不兼容,编译器会报错。
reinterpret_cast
1.用于将一种类型转换为另一种不同的类型,用于低级别的重新解释转换,如将指针转换为整数,或将一种指针类型转换为另一种不相关的指针类型。
2.这种转换不进行安全性检查,可能导致未定义行为,因此应谨慎使用。意义在于它提供了一种灵活的方式来重新解释数据类型,特别是在需要进行低级操作或处理不同数据类型时。
const_cast
不会改变表达式的值,用途就是删除变量的const属性,方便赋值。不加volatile关键字修饰也会删除常量属性。在编译时检查
dynamic_cast
class A{public:virtual void f() {}int _x = 0;};class B : public A{public:int _y = 0;};void fun(A* pa){// pa是指向子类对象B的,转换可以成功,正常返回地址// pa是指向父类对象A的,转换失败,返回空指针B* pb = dynamic_cast<B*>(pa);if (pb){cout << \"转换成功\" << endl;pb->_x++;pb->_y++;}else{cout << \"转换失败\" << endl;}}int main(){A aa;fun(&aa);B bb;fun(&bb);return 0;}
1.C++中向上转型,将派生类指针或引用转换为基类指针或引用会发生切片,是语法规则天然支持的。而向下转型,将基类或引用转换为派生类指针或引用,需要dynamic_cast关键字的修饰。
2.原理:当使用 dynamic_cast 进行向下转型时,运行时系统会检查基类指针或引用实际指向的对象的类型标识。如果实际类型与目标派生类类型兼容(即实际类型是目标派生类类型或其派生类),则转换成功。如果实际类型与目标派生类类型不兼容,则转换失败。
3.向下转型不会改变对象本身。对象仍然是原来的对象,只是通过指针或引用的类型被重新解释为派生类类型。使用该关键字转型是安全的
注意:
强制类型转换关闭或挂起了正常的类型检查,每次使用强制类型转换前,应该仔细考虑是否还有其他不同的方法达到同一目的,如果非强制类型转换不可,则应限制强制转换值的作用域,以减少发生错误的机会。
建议:避免使用强制类型转换
1.4了解RTTI
Run-time Type identification的简称,即:运行时类型识别。
C++通过以下方式来支持RTTI:
- typeid运算符
- dynamic_cast运算符
- decltype