转换(cast)的用途很广。在计算时可能需要进行基本数据类型的转换,在调用各种函数时,可能需要将自己的数据类型或对象转换为函数参数定义的数据类型或对象。
对于将“窄”类型变换为“宽”类型时,一般可以不用显式声明。这时就属于隐式转换。除了这种情况,其他都是显式转换。转换方式有如下几种:
1、在变量或常量前用括号括一个需要转换的目标类型关键字;另外一个不常用的是,在转换目标类型后面用括号将常量或变量括起来。对于后一个用法,建议:转换一般用于变量,而不用于常量;
C++的显式转换:(其实我个人认为上面也属于C++的显式转换)
static_cast 用于“良性”和“适度良性”转换,包括不用强制转换(例如自动类型转换)
const_cast 对“const”和/或“volatile”进行转换
reinterpret_cast 转换为完全不同的意思。为了安全使用它,关键必须转换为原来的类型。转换成的类型一般只能用于位操作,否则就是为了其他隐秘的目的。这时所有转换中最危险的。
dynamic_cast 用于类型安全的向下转换(“窄”转换,父类向子类转换)。
C++中不用转换是不允许从void*中赋值的。这时很危险的,要求程序员知道他们正在做什么。一个例子如下:
void * vp = & i;
float * fp = ( float * )vp; // 老的转换方法会产生错误
fp = static_cast < float *> (vp); // 新方法同样可能会产生错误
新的方法可以有助于程序员查找问题可能出现的地方。
如果从const转换为非const或从volatile转换为非volatile,可以使用const_cast。这是const_cast唯一允许的转换;如果进行别的转换就可能要使用单独的表达式或者可能会得到一个编译错误。注解:同一种类型的变量,可以在const和非const、volatile和非volatile之间转换。不同类型的就不行,编译会报错。可以用下面方式转换不同类型的变量:
float * l = ( float * )( & m);
reinterpret_cast的转换,是最不安全的一种转换机制,最有可能出问题。——《C++编程思想》原文引述。它属于一种低级的位操作。有些人说就是不管3721给你转。有点道理!
还有一个dynamic_cast,主要用于父子的转换(似乎有搞乱备份的嫌疑),属于运行时类型识别(RTTI)。当使用dynamic_cast时,必须对一个真正多态的层次进行操作——它含有虚函数——这因为dynamic_cast使用了存储在VTABLE中的信息来判断实际的类型。这里,基类含有一个虚析构函数并定义了它。