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. hadoop跑第一个实例过程

    第一次跑hadoop实例,中间经过了不少弯路,特此记录下来: 第一步:建立一个maven过程,pom.xml文件:(打包为jar包) <dependency> <groupId> ...

  2. [三]SpringBoot 之 热部署

    如下配置 <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring ...

  3. P4622 [COCI2012-2013#6] JEDAN

    题目背景 COCI 题目描述 有N个数排成一行(数值代表高度),最初所有的数都为零,你可以选择连续的一段等高的数,将它们都增加1(除了开头和结尾那个数)如下图表示了两次操作: 现在有一些数字看不清了, ...

  4. Shortest Prefixes POJ - 2001(统计次数)

    题意: 输出每个单词的缩写  使得每个单词 互不相同.. 解析: 统计每个前出现的次数...然后在查询的时候  遇到次数为1的返回即可.. #include <iostream> #inc ...

  5. Android ActionBar 使用详解

    ActionBar取代了以前的TitleBar,是一种更加灵活的人机交互方式:ActionBar并不是完全自立门户的一个新兴的东西,而是和3.0以下版本的menu进行了合并整合:so,添加action ...

  6. Netsh命令-修改网络IP设置

    原文链接地址:https://blog.csdn.net/qq_38054198/article/details/77990914 静态设置IP 修改IP地址addr和子网掩码mask: \>n ...

  7. ZendFramework安装配置

    1.创建项目目录 E:/wwwroot/myzfpro 运行cmd后,cd到框架源文件的bin目录 运行zf.bat创建命令:zf.bat create project E:/wwwroot/myzf ...

  8. 【learning】矩阵树定理

    问题描述 给你一个图(有向无向都ok),求这个图的生成树个数 一些概念 度数矩阵:\(a[i][i]=degree[i]\),其他等于\(0\) 入度矩阵:\(a[i][i]=in\_degree[i ...

  9. signal和sigaction 分析

    1:signal 函数 原型: sighandler_t signal(int signum, sighandler_t handler)      typedef void (*sighandler ...

  10. 题解【bzoj2038 [2009国家集训队]小Z的袜子(hose)】

    Description \(m\) 个询问,每次给出一个区间,求从这个区间中取出两个数使得它们同色的概率. \(n,m,a_i \leq 50000\) Solution 莫队模板题 最后的概率是 选 ...