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

dynamic_cast运算符,用于将基类的指针或引用安全地转换成派生类的指针或引用,是实现RTTI(运行时类型识别)的两个运算符之一。

使用形式如下:

// type必须是一个类类型
dynamic_cast<type*>(e) // e必须是一个有效的指针
dynamic_cast<type&>(e) // e必须是一个左值
dynamic_cast<type**>(e) // e不能是左值

注意:

  • 一般来说,只要有可能我们应该尽量使用虚函数。当操作被定义成虚函数时,编译器将根据对象的动态类型自动地选择正确的函数版本。
  • 然而并非任何时候都能定义一个虚函数。假设我们无法使用虚函数,则可以使用一个RTTI运算符。
  • 另一方面,与虚成员函数相比,使用RTTI运算符蕴含更多潜在风险:程序员必须清除地知道转换的目标类型并且必须检查类型转换是否被成功执行。
  • 转换失败会的后果:
    • 如果转换目标是指针类型并且失败了,则结果为0.
    • 如果转换目标是引用类型并且失败了,则运算符将抛出一个bad_cast异常。

参考书目

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

C++显式类型转换的更多相关文章

  1. C#中,使用显式类型转换(int)和Math.Round方法,将浮点数转换为整数的区别

    主要区别就是,显式类型转换(int)是将浮点数的整数部分截取出来,然后转换为整数,所以相当于是向下取整.而Math.Round方法是对浮点数进行四舍五入后,转换为整数. 新建一个.NET Core控制 ...

  2. C++进阶--显式类型转换(casting)

    //############################################################################ /* * 显式类型转换 * * 类型转换 ...

  3. javascript显式类型转换

    尽管js可以做许多自动类型转换,但某些时候仍然需要做显示类型转换或为了代码逻辑清晰易读而做显示类型转换. 做显示类型转换最简单的方法就是用Boolean().Number().String()或Obj ...

  4. JavaScript显式类型转换与隐式类型转换

    隐式类型转换 四则运算 判断语句 toString 在 JavaScript 中声明变量不需指定类型,对变量赋值也没有类型检查,同时还允许隐式类型转换. 这些特征说明 JavaScript 属于弱类型 ...

  5. C++中的显式类型转换

    一.学习总结 1.C++中额外提供的类型转换有 (1) reinterpret_cast: 格式:reinterpret_cast<type-id> (expression)①type-i ...

  6. C++学习之显式类型转换与运行时类型识别RTTI

    static_cast const_cast reinterpret_cast 运行时类型识别(RTTI) dynamic_cast 哪种情况下dynamic_cast和static_cast使用的情 ...

  7. Golang 类型转换,断言和显式强制转换

    1 前言 类型转换,可以用断言(只能使用在interface{}类型转换成其它类型)和显式类型强制转换(常规是用于基本类型) 2 代码 //graphql-go func(params graphql ...

  8. dynamic_cast 和 static_cast 隐式类型转换的区别

    首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为“标准转换”,包括以下几种情况:1) 算术转换(Arithmetic conversion ...

  9. javascript显式类型的转换

    显式类型转换目的:为了使代码变得清晰易读,而做显示类型的转换常使用的函数:Boolean(),String(),Number()或Object()如:Nunber(5) //5String(true) ...

随机推荐

  1. 第109天:Ajax请求GET和POST的区别

    一.Ajax请求GET和POST的区别 1.使用Get请求时,参数在URL中显示,而使用Post方式,则不会显示出来 2.使用Get请求发送数据量小,Post请求发送数据量大 3.get请求需注意缓存 ...

  2. 第75天:jQuery中DOM操作

    一.基础操作 1.html() 使用html()方法读取或者设置元素的innerHTML. 就是相当于javascript里头的innerHTML. 2.text() 使用text()方法读取或者设置 ...

  3. git commad

    repo forall -c 'echo $REPO_PATH;ssh trd.git.htc.com -p29419 -lowen_wen gerrit create-project --submi ...

  4. 关于qt中的tr()函数

    关于qt中的tr()函数 在论坛中漂,经常遇到有人遇到tr相关的问题.用tr的有两类人: (1)因为发现中文老出问题,然后搜索,发现很多人用tr,于是他也开始用tr (2)另一类人,确实是出于国际化的 ...

  5. 浅谈Android发展趋势分析

    去年11月16.17日,我有幸参加了北京2017安卓技术大会,做了关于车载Android系统的演讲,并主持了诸多大咖参与的圆桌讨论,对Android未来几年的发展趋势进行了一番讨论.来自小米.百度.高 ...

  6. 【WPF】PopupColorEdit 的使用

    一.前言        PopupColorEdit 是 dev中一个常用的调色盘控件,它的Color属性返回的是一个System.Windows.Media.Color对象,而不是System.Dr ...

  7. 线性判别分析(Linear Discriminant Analysis)

    1. 问题 之前我们讨论的PCA.ICA也好,对样本数据来言,可以是没有类别标签y的.回想我们做回归时,如果特征太多,那么会产生不相关特征引入.过度拟合等问题.我们可以使用PCA来降维,但PCA没有将 ...

  8. python学习(十四)正则表达式

    原文链接 ## 什么是正则表达式`正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑 ...

  9. 组合计数 && Stirling数

    参考: http://blog.csdn.net/qwb492859377/article/details/50654627 http://blog.csdn.net/acdreamers/artic ...

  10. Windows 安装 RabbitMQ

    RabbitMQ概述 RabbitMQ是流行的开源消息队列系统,是AMQP(Advanced Message Queuing Protocol高级消息队列协议)的标准实现,用erlang语言开发.Ra ...