学科分类
目录
C++基础

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 = &num;
 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++知识的逐步深入学习,会依次用到,读者可以在以后的学习中多多使用加深理解。

点击此处
隐藏目录