强制类型转换

在C语言中,强制类型转换存在两种等价形式:Type(Value)或(Type)Value。

而C++强调安全,不仅为用户提供了自定义类型转换的极大自由度,也在语法层面为类型转换可能会带来的各种错综复杂的情况作出了严谨的规定。

static_cast

编译期间,将值从一种数值类型转换为另一种数值类型,比如说从int转换成double型

reinterpret_cast

reinterpret,即“重新解释”,顾名思义,这个强制类型转换的作用是提供某个变量在底层数据上的重新解释。转换前后内存中的二进制值是不变的。当我们对一个变量使用reinterpretcast后,编译器将无视任何不合理行为,强行将被转换变量的内存数据重解释为某个新的类型。需要注意的是,reinterpretcast要求转换前后的类型所占用内存大小一致,否则将引发编译时错误。

比如将指针a转换成void*,reinterpret_cast < void * >a。

const_cast

可以为一个变量强行增加或删除其const限定。

即使用户通过const_cast强行去除了const属性,也不代表当前变量从不可变变为了可变。constcast只是使得用户接管了编译器对于const限定的管理权,故用户必须遵守“不修改变量”的承诺。如果违反此承诺,编译器也不会因此而引发编译时错误,但可能引发运行时错误。

dynamic_cast

当一个静态类型为基类指针或引用的变量确实存放了继承类指针或引用时,从基类向继承类的类型转换,即向下类型转换理论上是可行的,dynamic_cast即用于在运行时实现向下类型转换。

const的用法

《The C++ Programming Language》里面给出过一个助记的方法:把一个声明从右向左读。

// * 读成 pointer to
// const只能属于前面的类型
char * const cp;
cp is a const pointer to char

const char * p;
p is a pointer to const char;

因此const char * 这样才可以确保字符串不被修改,当然如果想要改还是有办法的,这个只是在编辑器的层面不让修改。这样可以让自己的代码更加健全