类型转换
标准类型转换太不严格。例如:
1
2
3
4
5
6
7
8
struct Doof {
double feeb;
double steeb;
char sgif[10];
};
Doof leam;
shart * ps = (short *) & leam;
int * pi = int * (&leam);《C++ Prime Plus》中的例子。C语言不能防止将一种类型的指针转换为另一种完全不相关的类型的指针。
因此,C++中使用了:
dynamic_cast
static_cast
const_cast
reinterpret_cast
四种类型转换运算符来执行涉及指针的类型转换。
1. dynamic_cast
该运算符的用途是,使得能够在类层次结构中进行向上转换(由于is-a关系,这样的类型转换是安全的),而不允许其他转换。用法如下:
1 |
|
用于动态类型转换。只能用于含有虚函数的类,用于类层次间的向上和向下转化。只能转指针或引用。向下转化是,如果是非法的对于指针返回NULL,对于引用跑一场。要深入了解内部转换的原理。
- 向上转换:指的是子类向基类的转换
- 向下转换:指的是基类想子类的转换
它通过判断在执行到该语句的时候变量的运行时类型和要转换的类型是否相同来判断是否能够向下转换。
2. const_cast
const_cast
运算符用于执行只有一种用途的类型转换,及改变值为const
为volatile
,其语法与dynamic_cast
运算符相同:
1 |
|
通俗讲,就是const_cast用于(is-a)关系中将const转换为非const。
提供该运算符的原因是,有时候可能需要这样一个值,它在大多数时候是常量,而有时又是可以修改的。在这种情况下,可以将这个值声明为const,并在需要修改它的时候,使用const_cast。
此外,还用于将const变量转为非const
1 |
|
3. static_cast
static_cast
运算符的语法与其它运算符一致,用于将const变量转为非const:
1 |
|
仅当type_name可被隐式转换为expression所属的类型或expression可被隐式转换为type_name所属类型时,上述转换才是合法的,否则将出错。
假设High是Low的基类,而Pond是一个无关的类,则从High到Low的转换、从Low到High的转换都是合法的,而从Low到Pond的转换是不允许的:
4. reinterpret_cast
几乎什么都可以转,比如将int转指针,可能会出问题,尽量少用;