C++中的类型转换
C风格的转换格式简单但也有不少缺点,它并不能满足C++语言中数据类型转换的使用要求,所以C++提供了自己的类型转换操作符,C++的类型转换操作符一共有四种,如下代码所示:
static_cast<new_type>(expression);
const_cast<new_type>(expression);
dynamic_cast<new_type>(expression);
reinterpret_cast<new_type>(expression);
接下来我们就对这四种类型转换操作符进行详细讲解。
1、static_cast<>
static_cast<>是最常用的类型转换操作符,它主要执行非多态的转换,用于代替C语言中通常的转换操作,它的作用主要有以下几个方面。
● 基本数据类型之间的转换,如把int类型转换为char类型等。
● 把任何类型的表达式转换成void类型。
● 把空指针转换成目标类型的指针。
● 用于类层次结构中基类和子类之间指针或引用的转换,在进行上行转换(把子类的指针或引用转
换成基类类型)是安全的,但是在进行下行转换(把基类指针或引用转换成子类类型)时,由于没有动态类型检查,是不安全的。
注意:static_cast<>不能转换掉数据的const、valitble等特性。
2、const_cast<>
const_cast<>在进行类型转换时用来修改类型的const或volatile属性,除了const或volatile修饰之外,原来的数据值和数据类型都是不变的。
为了让读者更深刻的理解其用法,接下来通过一个案例来演示,如例1所示。
1 #include <iostream>
2 using namespace std;
3 int main()
4 {
5 int num = 100;
6 const int* p1 = #
7 int* p2 = const_cast<int*>(p1); //将常量指针p1转换为普通指针类型,去掉const属性
8 *p2 = 200;
9 cout << "num = " << num << endl;
10 system("pause");
11 return 0;
12 }
运行结果如图1所示。
图1 例1-3运行结果
由图1所知,通过const_cast<>操作符将p1指针的const属性去除然后赋值给p2,通过p2指针成功修改了num的值。常量指针被转化成非常量指针,并且仍然指向原来的对象。但是若使用static_cast<>操作符则无法达到这个目的。
3、dynamic_cast<>
该操作符用于运行时检查类型转换是否安全,但只在多态类型时合法,即该类型至少具有一个虚拟方法。它与static_cast具有相同的语法,但dynamic_cast主要用于类层次间的上行和下行转换,以及类之间的交叉转换。在类层次间进行上行转换时,它和static_cast效果是一样的,在进行下行转换时,它具有类型检查的功能,比static_cast更安全。
4、reinterpret_cast<>
对reinterpret_cast操作符有一种比较专业的术语解释:通常为操作数的位模式提供较低层的重新解释。这句话初学者理解起来并不容易,我们把它“翻译”过来解释,如果将一个类型(如int类型)的数据a转换为另一个类型(如double类型)的数据b时仅仅是将a的比特位复制给b,不作数据转换,也不进行类型检查。而且reinterpret_cast要转换的new_type类型必须是指针类型、引用或算术类型,例如下面的代码:
char c = 'a';
int d = reinterpret_cast<int&>(ch);
这个转换只是单纯的将字符c中的比特位复制给了d,并没有进行必要的分析和类型等的检查。这种转换方式一般较少使用。
关于这四个类型转换操作符,随着C++知识的逐步深入学习,会依次用到,读者可以在以后的学习中多多使用加深理解。