C++学习笔记8 - static_cast、reintepret_cast、const_cast、dynamic_cast、auto、decltype

一、static_cast

  1. 源生类型之间的隐式类型转换,可以用 static_cast 来明确告知编译器,避免警告,转换后可能丢失精度。正确性需要程序员自己保证。
  2. 用来将(void *p)转为具体的指针类型,取回原有的指针类型
  3. 用于类层次结构中父类和子类之间指针和引用的转换。其中上行转换是安全的,下行转换是不安全的。
  4. 总结:static_cast<>()是编译时静态类型检查,使用 static_cast 可以尽量发挥编译器的静态类型检查功能,但是并不能保证代码一定“正确”(譬如可能会丢失精度导致错误,可能经过(void*)之后导致指针类型错误,可能下行转换导致访问错误)
  5. 评价:能理解使用 static_cast 的意义,但是实际上只能解决很初级的编程问题,属于初级语法特性。
  6. int* p; void* p1 = p; int* p2 = static_cast(p1);

二、 reintepret_cast

  1. 用于明确告知编译器该类型转换在编译时放行,正确性由程序员自己负责。
  2. reintepret_cast 转换前后对象的二进制未发生任何变化,只是对这些二进制位的编译器类型标识发生了变化,或者说是编译器看待这些二进制位的结论不同了。
  3. reintepret_cast 一般用于将指针转成 int 或者回转,将A类型指针转为B类型指针等
  4. reintepret_cast 其实就是让C++在本次转换中放弃严苛的编译器类型检查
  5. int* p1; char *p2 = reinterpret_cast(p1); //将int*墙砖char*

三、const_cast

  1. 用来修改类型的 const 或 volatile 属性
  2. 格式为:const_cast(expression)
  3. 主要用于函数传参(函数要求传const参数,而实参非const,转换后const_cast实参)
  4. func(const_cast(p1), const_cast(p2)); //将非const变量强转const进行传参

四、dynamic_cast

  1. 只用在父子 class 的指针和引用访问时的转换中,尤其是下行转换时
  2. 属于一种运行时转换机制,运行时才能知道转换结果是 NULL 还是有效对象
  3. 运行时确定对象类型RTTI(run time type identification)是一种需求,C++有一套机制来实现

五、对4种cast转换的总结

  1. C中一般都用隐式转换或强制类型转换解决,本质上是一种一刀切方案,全靠程序员自己把控
  2. C++ 中4种cast转换实际上是细分了具体场景,让程序员在具体情况下显式的使用相应的cast来转换,让编译器和运行时尽可能帮程序员把关
  3. 前三种cast(static_cast、reintepret_cast、const_cast),均属于编译时转换,而 dynamic_cast 属于运行时转换。

六、C++的自动类型推导1 —— auto

  1. auto 在C中修饰局部变量,可以省略,完全无用。C++中的auto完全是一个新关键字
  2. auto 要求至少不低于C++11标准来支撑
  3. auto 在编译器由编译器帮我们自动推导出变量(对象)类型,所以定义时必须初始化
  4. auto 可以一次定义多个同类型的变量,但是不能一次定义多个类型不同的变量,这是auto的类型推导机制决定的
  5. int i = 5; auto j = i; //自动推导出j是int类型

七、C++的自动类型推导2 —— decltype

  1. C++11新增关键字
  2. decltype 可以让编译器推导目标表达式的类型作为一种类型符使用
  3. decltype(表达式)作为类型定义变量不要求初始化
  4. double i = 5; decltype(i) j; //用i的类型定义了一个变量j

八、auto 和 decltype 的对比

  1. auto 忽略顶层 const,而 decltype 则保留const
  2. auto 作为类型占用符,而 decltype 用法类似于 sizeof 运算符
  3. 对引用操作,auto 推断出原有类型,decltype 推断出引用
  4. 对解引用操作,auto推断出原有类型,decltype 推断出引用
  5. auto 推断时会实际执行,decltype 不会执行,只做分析

你可能感兴趣的:(C++,c++)