C++当中的转换复杂,容易混淆,更容易出错,今天对<<C++编程思想>>进行了相关的阅读与理解,现记录初步的理解如下:
C++当中的显示类型转换的目的就是要告诉编译器:我来接管你的类型检查,你少管我,我现在已经长大了,做的事情是不是合法的我自己知道,你应该把我当成年人看待。所以,即使我做错了转换,编译器也不会报错或者是提出警告,这个时候更要考察作为程序员的我们的检查能力了。
(1)static_cast
它用于明确定义的转换,包括典型的非强制转换 、窄化转换 、使用void*的强制转换 、隐式类型转换 、类层次的静态定位 。
注意,它不可用在没有继承关系的对象指针之间互换,这个时候可以借助于void*的转换
void func(int i) {}
int main(){
int i=0x7fff;
long l;
float f;
//非强制转换
l=i;
f=i;
l=static_cast<long> (i);//同上边的等价
f=static_cast<float> (i);//同上边等价
//窄化转换
i=l;//可能会丢失信息
i=f;
i=static_cast<int>(l);
i=static_cast<int>(f);
// 使用void*的强制转换
void *vp=&i;
float *fp=(float*)vp;//一个危险的转换
fp=static_cast<float*>(vp);//一个危险的转换,但是我们这里使用的
//是显示的方式,便于调试
}
(2)const_cast
它唯一允许的转换:若从const转换为非const或从volatile转换为非volatile,可以使用const_cast.
需要注意的是:const_cast转换的源均为地址型值。
(3)reinterpret_cast
它是一种最不安全的转换机制,最有可能出现问题了。它的工作原理为:将对象假设为模式,仿佛是一种完全不同的类型的对象。它是低级的位操作。
(4)dynamic_cast
一种安全类型向下转换操作。当使用dynamic_cast试着向下类型转换一个特定的类型时,仅当类型转换是正确的并且成功的时候,返回值是一个指向所需类型的指针,否则它将返回0来表示这并不是正确的类型。
并且要注意的是,使用dynamic_cast的时候,必须对一个真正多态的层次进行操作(即该类应该含有虚函数),因为dynamic_cast使用了存储在VTABLE当中的信息以判断实际的类型。
但是,dynamic_cast运行时较static_cast的开销更大,我们可以通过static_cast来代替dynamic_cast,只要我们知道处理的是何种类型。