文章目录
  1. static_cast
  2. dynamic_cast
  3. reinterpre_cast
  4. const_cast

显式类型转换操作符:static_cast、dynamic_cast、const_cast与reinterpret_cast。

显式转换的形式如下

1
2
/* cast-name = static_cast | dynamic_cast | const_cast | reinterpret_cast */
cast-name<type> (expression);

static_cast

编译器隐式执行的任何类型转换都可以由static_cast显式完成。

Q:为何要这样做

A:因为从一个较大类型到一个较小类型的赋值 会导致编译器产生一个警告以提醒我们潜在的精度损失 当我们提供显式强制转换时 警告消息被关闭 强制转换告诉编译器和程序的读者 我们不关心潜在的精度损失。

dynamic_cast

dynamic_cast操作符可以用来将一个类对象的指针转换成同一类层次结构中的其他类类型的指针,同时也可以用它把一个类对象的左值转换成同一类层次结构中其他类类型的引用。

它支持在运行时刻识别(即RTTI)由指针或引用指向的类对象。

dynamic_cast 操作符被用来执行从基类指针到派生类指针的安全转换,它常常被称为安全的向下转换。

1
用指向基类类型的指针来操纵派生类类型的对象,这通常通过虚函数自动处理,但是在某些情形下使用虚拟函数是不可能的,dynamic_cast 为这些情形提供了替代的机制,但是这种机制比虚拟成员函数更易出错,应该小心使用

reinterpre_cast

reinterpre_cast通常对于操作数的位模式执行一个比较低层次的重新解释,它的正确性很大程度上依赖于程序员的主动管理。

const_cast

const_cast用于转换表达式的常量性,即改变对象的底层const。

1
2
3
4
5
const的修饰原则:

优先修饰左边,即int * const p;中const修饰int *

若左边无内容,则修饰右边
1
2
3
4
5
6
7
8
int num=1;
int * const p1 = & num;//const修饰int *,即p1是一个常量,顶层const
int const cnum;//const修饰int,即cnum是一个常量,顶层const
const int * p2 = & cnum;//const修饰p2指向的变量cnum,底层const

总结:
顶层const:(顶层const)本身是一个常量;
底层const:作为指针指向的对象是常量

所谓用于转换表达式的常量性,即

1
2
3
const char * pc;

char * p = const_cast<char *>(pc);

此时p与pc的值相同,但是p指向的内容仍是常量,不可修改!

当一个对象的值可能会在编译器的控制或监测之外被改变时,该对象应声明为volatile。const_cast也会转换volatile对象的volatile性。

1
volatile会在多线程中被使用,当两个或多个线程都要用到同一变量且该变量的值会被改变时,就需要用volatile声明,以防止编译器为了优化代码而将该变量装入CPU寄存器中,而是每次使用该变量都需要从内存中读取