为了让C语言的类型转换更安全, C++ 采用了不同的内存重新映射的方法
static_cast 由高精度向低精度数据、由子类指针类向父类指针, 就是可以“丢失内容”的转换, 也可以由void*向其它类型转换
const_cast 用于映射常量到变量
dynamic_cast 可以安全的由低精度向高精度、由父类指针到子类指针, 就是“增加内容”的转换
reinterpret_cast 可以映射毫无相关的类型, 是非常危险的, 不推荐使用的
“丢失内容”的转换其实不用转换,既然是丢失内容,不要的扔了算了,直接赋值就可以,但是写上 static_cast 可以让读程序的人知道是不同类型之间的赋值
不同于 C 语言, C++ 不允许直接从 void* 到其它类型的赋值,因为是不安全的,不知道 void* 的内容究竟是什么,写上 static_cast 就认为是你认真考虑过这个问题了,可以赋值。
const_cast 允许把常数的地址赋值给变量指针,用变量指针访问常数
dynamic_cast 是可以“增加内容”的转换,但是增加什么内容呢?不能凭空想象,dynamic_cast 会从每次赋值追溯到程序的最开始定义时的变量类型,如果与现在要重新映射的变量类型相同,或者是“丢失内容”的那种,就可以了。
例如:
class ta {...}; class tb:public ta{...}; class tc:public tb{...};
tb *b;
ta *x=b; //丢失内容那种,用 static_cast 或者直接赋值
tb *y=x; //增加内容那中,不允许。
tb *z=dynamic_cast(x); //因为追溯到最开始: x=b; b 是 tb 类型的, 所以相当于 z = b; 类型相同,转换成功
tc *w=dynamic_cast(x); //因为追溯到最开始,x 是tb 类型的,转换成 tc 类型的要增加内容,转换失败,结果 w = NULL;
tc *c;
b=c; //丢失内容合法
x=b; //丢失内容可以
tb *r=x; //增加内容不可以, 非法语句
tb *s=dynamic_cast(x); //s = x, x=b, b=c, c 是 tc 类型, 追溯源头由 tc 到 tb 丢失数据,可以,转换成功
reinterpret_cast 有两个目的:1.故弄玄虚,2.极特殊目的。你给的例子就属于1. :) 把结构赋值给 char *指针, 因为结构的内容在内存中的映射可以当作字符串使用,所以程序不会出错,这(风险)是由程序员决定的,C++编译器根本不做任何干预。
date 是 struct,
程序写着 static struct {...} date = {"....
类似 static int x = ... 的语法
--------------------next---------------------
阅读(1358) | 评论(0) | 转发(0) |