强制类型转换

来源:互联网 发布:淘宝 app 编辑:程序博客网 时间:2024/06/05 09:25

背景

C语言中的强制类型转换过于简单粗暴,没有考虑这样转换是否安全如一个指向结构体的指针转换为指向函数的指针,强制类型转换也能转换成功。因为对C来说指针都是一个占四个字节的空间转换成什么类型都是可以的。
在C语言中,强制类型转换的错误难以定位,用编译器的find可以找到一堆,有些封装过的更加难以找到

C++对强制类型转换的改进

c++将强制类型转换分为4中类型

1. static_cast

-用于基本类型间的转换,但不能用于基于类型指针 间的转换。
-有继承关系类对象之间的转换和类指针之间的转换
例:

#include<stdlib.h> #include <stdio.h>int main(void) {    int i = 0;    char c = 'c';    int *pi = &i;    char* pc = &c;    c = static_cast<char>(i);//把int转换成char==>错误     pc = static_cast<char*>(pi)//把int*转换成char*==>导致编译错误     system("PAUSE");    return 0;}

2.const_cast:用于去除变量的const属性

例:

#include<stdlib.h> #include <stdio.h>int main(void) {    const int& j = 1;//定义一个只读变量,j储存在内存中     int& k = const_cast<int&>(j);//去除j的只读属性     const int x = 2;//定义一个只读常量,x储存在符号表里    int& y = const_cast<int&>(x);//试图把只读常量变为变量     k = 5;    printf("j = %d\n",j);    printf("k = %d\n",k);    y = 8;    printf("x = %d\n",x);    printf("y = %d\n",y);    printf("&x = %X\n",&x);    printf("&y = %X\n",&y);    system("PAUSE");    return 0;}

输出结果:
j = 5
k = 5
x = 2
y = 8
&x = 0X61FEFC
&y = 00x61FEFC
显然就j,k的值很正常,但是为什么x和y的值不同呢?
解释:在定义时候j是存在内存中的只读变量,而x是存在只读存储区的符号表内的只读常量,const_cast强制把x只读常量变成变量,那么程序会在内存分配给x一个内存,而这个内存的别名叫x同时也叫y,因为取地址得到的地址是一样的。那么访问x时,还是直接去符号表内去取值为2,访问y时就去内存中去取值为8

3.reinterpret_cast:

**警告:**reinterpret_cast直接从二进制位进行复制,是一种极不安全的转换。
-用于指针类型间的强制转换
-用于整数和指针类型间的强制转换
例:

#include<stdlib.h> #include <stdio.h>int main(void) {    int i = 0;    char c = 'c';    int *p = reinterpret_cast<int*>(&c);//char*->int*    char *pc = reinterpret_cast<char*>(&i);//int*->char*    system("PAUSE");    return 0;}

4.dynamic_cast(待补充)

-主要用于类层次间的转换,还可以用于类之间的交叉转换
-dynamic_cast具有类型检查功能,比static_cast更安全

0 0