首页 > 编程语言 > 详细

C++显式类型转换

时间:2018-02-02 21:27:32      阅读:232      评论:0      收藏:0      [点我收藏+]

C++显式类型转换

(注:本文例程改编自《C++ Primer》)

关于类型转换,C++保留了C语言中的类型转换方式,并提供了4中新的类型转换方式。《Effective C++》鼓励我们使用新的转换方式:

第一,它们很容易在代码中被识别出来(不论是人工辨识或使用工具如grep),因而得以简化“找出类型系统在哪个地点被破坏”的过程。第二,各转型动作的目标愈窄化,编译器愈可能诊断出错误的运用。举个例子,如果你打算将常量性去掉,除非使用新式转型中的const_cast否则无法通过编译。

四类显式类型转换

static_cast

static_cast用于对对象进行强制的类型转换,但要求对象不是底层上的常量(指针常量为顶层常量,指针指向内容为常量即底层常量)

int i = 2, j = 1;
double dval = static_cast<double>(j) / i;

另外static_cast还可以用于对编译器无法自动执行的类型转换,如:

double dval;
void *p = &dval;
double *dp = static_cast<double*>(p);

const_cast

const_cast用于移除const对象的常量性质,并且C++中只有const_cast这一类型转换方式可以做到这一点。移除对象的常量性是合法的,但是移除后对常量对象进行写操作会产生未定义后果

示例:

const char *cp;
char *q = static_cast<char*>(cp); // 错误:static_cast不能移除常量性
static_cast<string>(cp); // 正确
const_cast<string>(cp); // 错误:const_cast只能用于移除常量性,不能进行强制类型转换

reinterpret_cast

reinterpret_cast会执行位数据上的底层类型转换操作,顾名思义是一种“重新解释”。

示例:

int *ip;
char *pc = reinterpret_cast<char*>(ip);

然而需要注意的是,reinterpret_cast的实际动作与编译器具体实现密切相关,可能会产生无法意料的错误,并且降低程序的可移植性,本文的参考书目不建议过多使用。

dynamic_cast

该转换方式与RTTI密切相关,后续将进行补充。

参考书目

  1. 《C++ Primer》中文第五版
  2. 《Effective C++》中文第三版

C++显式类型转换

原文:https://www.cnblogs.com/yanhewu/p/8406946.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!