C++的显示转换

来源:互联网 发布:开淘宝店在还好做吗 编辑:程序博客网 时间:2024/05/16 13:57

近日在看《C++ primer》,不得不说,中国的教材有些坑人,老师也有些坑人,只是说有些坑人,因为还是有些不错的!

在需要数据类型转换时,我习惯于用()进行转换,这也是谭浩强书本教的,也是大学老师教的方式。今天读《C++ primer》方才知道这是一种C风格的数据类型转换,是C++为了兼容C而保留下来的。

实际上,C++提供了类型转换操作符供显示的类型转换,即:

static_cast, dynamic_cast, const_cast, reinterpret_cast。

这四个是用来进行显示数据类型转换的。

这些数据类型转换操作符的一致用法是:

cast-name <type> (expression);

其中,cast-name是类型转换操作符名,type是目的数据类型 ,expression是待转换数据。

下面对这四个显式数据转换操作符进行简单的说明。

1.static_cast

在C语言中使用()实现的转换都可以使用static_cast操作符实现之。

2.const_cast

使用该操作符可以将待转换数据的const属于去除,如下代码所示:

#include <iostream>using namespace std;int main(int argc, char ** arg){const int b = 1;int *p = const_cast<int *>(&b);return 0;}
3.reinterpret_cast

通俗的说,这个转换可以讲任何数据类型的指针转换为其他数据类型的指针。

4.dynamic_cast

用在子类与父类之间的转换。


这里引用一个网络的博客的总结:

http://www.cnblogs.com/ider/archive/2011/08/05/cpp_cast_operator_part6.html

对于传统的转换方式(C式或函数式),只在数值类型(包括整型、浮点型、字符类型和枚举)上使用。这也是延续C的形式,当然这类转换也是可以用static_cast来替换,但是因为是基本类型,所以传统转换已经很直观。

对于const_cast转换运算符,用在需要去除掉const限定的时候。其实这种情况出现的很少,可能的方法在const_cast一文中已经又举例,不过还是反复强调, 使用const_cast转换后,绝对不可试图修改结果的值。

对于reinterpret_cast转换运算符,一般用在将对象指针类型转换到整数类型或者void * (空指针)。如同在文中举出的隐患,因此注意的是,若要使用其结果,一定要将类型转换回去后使用。也不要将随意的整数转换成指针类型。

对于static_cast转换运算符,将其用在对象的转换之上(虽然static_cast也可以用在有继承关系的类型指针之间,但是还是将这方面的转换交给dynamic_cast来操作吧), static_cast会调用相应的构造函数或者重载的转换运算符。


原创粉丝点击