C++类型转换

一、c强制转换

在 C 语言中,类型转换的方式一般可分为隐式类型转换显示类型转换(也称为强制类型转换)。其中隐式类型转换由编译器自动进行,不需要程序员干预。

隐式类型转换通常有两种情况:赋值转换运算转换

1、强制类型转换的定义与语法

强制类型转换是程序员显式告诉编译器将一个数据类型转换为另一个数据类型的操作。语法结构如下:

(type_name) expression

其中type_name是目标数据类型,expression是要转换的表达式。

2、常见的类型转换示例

  • 将浮点数转换为整数
  float x = 10.75;
  int y = (int) x; // y的值为10
  • 将字符转换为ASCII码值
  char ch = 'A';
  int ascii = (int) ch; // ascii的值为65

3、使用强制类型转换的注意事项

  • 可能导致数据丢失:例如,将浮点数转换为整数时,小数部分将被舍弃。
  • 可能导致未定义的行为:不当的类型转换可能导致程序行为无法预测。

4、强制类型转换与隐式类型转换的区别

  • 强制类型转换:由程序员显式指定,可以实现更灵活的类型转换。
  • 隐式类型转换:由编译器自动进行,通常发生在不同类型的数据之间进行运算时。

二、c++强制转换

1.const_cast

const_cast是一种C++运算符,主要是用来去除复合类型中const(不变的)和volatile(不稳定的)属性(没有真正去除)。

用法:const_cast(expression)

•常量指针转化为非常量的指针,并且仍然指向原来的对象

  •常量引用转化为非常量的引用,并且仍然指向原来的对象

也就是说源类型和目标类型除了const属性不同,其他地方完全相同。

const 的机制,就是在编译期间,用一个常量代替了 data。这种方式叫做常量折叠。

常量折叠与编译器的工作原理有关,是编译器的一种编译优化。在编译器进行语法分析的时候,将常量表达式计算求值,并用求得的值来替换表达式,放入常量表。所以在上面的例子中,编译器在优化的过程中,会把碰到的data(为const常量)全部以内容100替换掉,跟宏的替换有点类似。

常量折叠只对原生类型起作用,对我们自定义的类型,是不会起作用的。

2.static_cast

static_cast的转换格式:static_cast (expression)

将expression转换为type-id类型,主要用于非多态类型之间的转换,不提供运行时的检查来确保转换的安全性。主要在以下几种场合中使用:

1.用于类层次结构中,基类和子类之间指针和引用的转换;
当进行上行转换,也就是把子类的指针或引用转换成父类表示,这种转换是安全的;
当进行下行转换,也就是把父类的指针或引用转换成子类表示,这种转换是不安全的,也需要程序员来保证;

2.用于基本数据类型之间的转换,如把int转换成char,把int转换成enum等等,这种转换的安全性需要程序员来保证;

使用static_cast可以明确告诉编译器,这种损失精度的转换是在知情的情况下进行的,也可以让阅读程序的其他程序员明确你转换的目的不是由于疏忽。
  
把精度大的类型转换为精度小的类型,static_cast使用位截断进行处理。

3.把void指针转换成目标类型的指针,是及其不安全的;

注:static_cast不能转换掉expression的const、volatile和__unaligned属性。

你可能感兴趣的:(算法)