Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2342369
  • 博文数量: 816
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-17 17:57
文章分类

全部博文(816)

文章存档

2011年(1)

2008年(815)

分类:

2008-12-17 18:01:03

为了让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) |
给主人留下些什么吧!~~