C++ 强制类型转换
以下所有的cast 都不会作用于对象本身。只是返回相应的类型的对象。
1、const_cast<新类型>(表达式)
const_cast 可用于转型掉(移除)常量性或易变性。
1)两个指向同一类型的多级指针可以相互转换,无关每个层级的cv (const\volidate) 限定符号。
注意:
2) 如果通过const_cast对一个常量进行写修改为未定义行为。虽然该行为可以执行,但是其为未定义。
const int* a;
int *p = const_cast<int*>(a);//正确的表达式,但是通过p写值 是未定义行为
- 空指针可以转换成新类型的空指针。
2、static_cast<新类型>(表达式)
只要不报含底层const 都可以使用static_cast. 不允许转换转型走对象的常量性和易变性。一般会用在向下转型,允许丢失对应的精度。不允许指针和整形转换。
1)当我们把指针保存在void* 中的时候,并且使用static_cast 将其强制转换成原来类型的时候,我们要确保指针的值不会发生改变。
强制类型转换的结构与原始地址值相等,我们要确保转换后的类型就是指针所指的类型,否则会出现未定义行为。
3、reinterpret_cast<新类型>(表达式)
1)该表达使用极度危险。使用过后编译器会在编译期进行处理,不会编译成任何cpu指令(除非整形和指针之间转换。)
使用后编译器会将表达式的值当作新类型处理。
int a = 1;
int *b = reinterpret_cast<int*>(a);
//编译期 不会报错,但是执行期间会coredump,因为将一个整形的值作为指针的值;
2)不允许转走表达式的常量性和易变性。
3)reinterpret_cast 可以将指针和整形之间相互转换。但是要确保整形(一般为无符号数)的大小能够保有指针的所有值。
4)任何函数指针可转换成指向不同函数类型的指针。通过指向不同函数类型的指针调用函数是未定义的,但将这种指针转换回指向原函数类型的指针将生成指向原函数的指针值。
4、dynamic_cast<新类型>(表达式)
使用运行期类型识别(RTTI),该操作符一般用于:用基类的指针或者引用执行某个派生类的操作并且该操作不是虚函数。但也支持向下、向上、侧向转型。
1)若 表达式 是指向多态类型的指针,且 新类型 是到 void 的指针,则结果是指向 表达式 所指向或引用的最终派生对象的指针。
2)若 新类型 是到 Base 的指针或引用,且 表达式 的类型是到 Derived 的指针或引用,其中 Base 是 Derived 的唯一可访问基类,则结果是到 表达式 所标识的对象中 Base 类子对象的指针或引用。
浙公网安备 33010602011771号