提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、static_cast
static_cast主要用于一种类型转化成另外一种类型
主要用于:
1.用于类层次结构中基类和派生类之间指针或引用的转换
上行转化(把派生类的指针或引用转换成基类表示)是安全的
下行转化(把基类的指针或引用转换成派生类表示)不安全,并不像dynamic_cast有检测
2.用于基本类型的转化,例如int转化double
3.把空指针转化成目标类型空指针
4.把任意类型转化成void类型
二、dynamic_cast
首先dynamic_cast与其他三种强制类型转换不同的点在与,它是在运行时类型检查,而其他三种是在编译时处理的,其次dynamic_cast不能用与基本类型数据的强制转换
主要用于:
1.用于类层次结构中基类和派生类之间指针或引用的转换,与static_cast不同的是,dynamic_cast转换如果成功的话返回的是指向类的指针或引用,转换失败的话则会返回NULL。它会有一个安全措施,确保了安全性
2.使用dynamic_cast进行转换的,基类中一定要有虚函数,否则编译不通过。
PS: 基类中需要检测有虚函数的原因:类中存在虚函数,就说明它有想要让基类指针或引用指向派生类对象的情况,此时转换才有意义。
三、const_cast
弥补了static_cast无法转换const/volitale的不足,将expression的const/volitale属性移除,仅限于底层const属性.
需要注意的是:const_cast不是去除常量的const属性,而是去除指向常量的指针或引用的属性
举个例子:
int main()
{
const int a = 7;
const int* p = &a;
int* q = const_cast<int*>(p);
*q = 20; //通过q写值是未定义的行为
printf("q=%d\n", *q);
printf("a=%d\n", a);
cout << "q=" << q << endl;
cout << "a=" << &a << endl;
}
a是常量,所以无法改变它的值,const_cast只是改变指向常量指针的常量性,通过地址改变其值

但是出现以下的状况,q指向地址和a的地址相同,*q改变了a的值,但是显示出来却是没改变,一个猜想是可能是编译器的问题,本质上是已经改变了,我们来通过调试来看一看。

通过调试我们发现确实是这样,内存以及改了,但是显示出来还是没改的样子

四、reinterpret_cast
reinterpret_cast 允许将任何指针转换为任何其他指针类型。 也允许将任何整数类型转换为任何指针类型以及反向转换。
PS:
1.reinterpret_cast 运算符可用于 char* 到 int* 或 One_class* 到 Unrelated_class* 之类的转换,这本身并不安全,但可以通过编译;
2. reinterpret_cast 的本质作用是重新定义内存数据的解释方式,而不进行任何二进制转换。
2938

被折叠的 条评论
为什么被折叠?



