C++显式类型转换
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
异常。
参考书目
- 《C++ Primer》中文第五版
- 《Effective C++》中文第三版
C++显式类型转换的更多相关文章
- C#中,使用显式类型转换(int)和Math.Round方法,将浮点数转换为整数的区别
主要区别就是,显式类型转换(int)是将浮点数的整数部分截取出来,然后转换为整数,所以相当于是向下取整.而Math.Round方法是对浮点数进行四舍五入后,转换为整数. 新建一个.NET Core控制 ...
- C++进阶--显式类型转换(casting)
//############################################################################ /* * 显式类型转换 * * 类型转换 ...
- javascript显式类型转换
尽管js可以做许多自动类型转换,但某些时候仍然需要做显示类型转换或为了代码逻辑清晰易读而做显示类型转换. 做显示类型转换最简单的方法就是用Boolean().Number().String()或Obj ...
- JavaScript显式类型转换与隐式类型转换
隐式类型转换 四则运算 判断语句 toString 在 JavaScript 中声明变量不需指定类型,对变量赋值也没有类型检查,同时还允许隐式类型转换. 这些特征说明 JavaScript 属于弱类型 ...
- C++中的显式类型转换
一.学习总结 1.C++中额外提供的类型转换有 (1) reinterpret_cast: 格式:reinterpret_cast<type-id> (expression)①type-i ...
- C++学习之显式类型转换与运行时类型识别RTTI
static_cast const_cast reinterpret_cast 运行时类型识别(RTTI) dynamic_cast 哪种情况下dynamic_cast和static_cast使用的情 ...
- Golang 类型转换,断言和显式强制转换
1 前言 类型转换,可以用断言(只能使用在interface{}类型转换成其它类型)和显式类型强制转换(常规是用于基本类型) 2 代码 //graphql-go func(params graphql ...
- dynamic_cast 和 static_cast 隐式类型转换的区别
首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为“标准转换”,包括以下几种情况:1) 算术转换(Arithmetic conversion ...
- javascript显式类型的转换
显式类型转换目的:为了使代码变得清晰易读,而做显示类型的转换常使用的函数:Boolean(),String(),Number()或Object()如:Nunber(5) //5String(true) ...
随机推荐
- 第138天:Web前端面试题总结(编程)
1.如何让一个盒子水平垂直居中 //已知宽高 <div class="div1"></div> <style> .div1{ width:400 ...
- luogu 1967 货车运输(最大生成树+LCA)
题意:给出一颗n个点的图,q个询问,每次询问u到v的路径中最小的边最大是多少. 图的最大生成树有一个性质,对于该图的任意两个点,在树中他们之间路径的最小边最大. 由于这个图不一定联通,于是我们对它的联 ...
- 【bzoj3576】[Hnoi2014]江南乐 博弈论+SG定理+数学
题目描述 两人进行 $T$ 轮游戏,给定参数 $F$ ,每轮给出 $N$ 堆石子,先手和后手轮流选择石子数大于等于 $F$ 的一堆,将其分成任意(大于1)堆,使得这些堆中石子数最多的和最少的相差不超过 ...
- spring的事务传播特性
PROPAGATION_REQUIRED(常用) Support a current transaction; create a new one if none exists. 支持一个当前事务;如 ...
- Best Reward HDU - 3613(马拉车+枚举+前缀和)
题意: 给你一串字符串,每个字符都有一个权值,要求把这个字符串在某点分开,使之成为两个单独的字符串 如果这两个子串某一个是回文串,则权值为那一个串所有的字符权值和 若不是回文串,则权值为0 解析: 先 ...
- 【CodeChef PREFIXOR】Prefix XOR
https://odzkskevi.qnssl.com/f0fbdb108ec813b1294f8f714805963b?v=1502083692 网上搜到的题解: http://blog.csdn. ...
- CF Playrix Codescapes Cup Problems Analysis
A 理清思路模拟 B 先对3个array排序,然后每次从某个array的头删数,可保证每个数必被处理1次,O(n log n) (set维护也行) C 分3类情况讨论,一种为: p1≤p2 & ...
- BZOJ2212 [Poi2011]Tree Rotations 【线段树合并】
题目链接 BZOJ2212 题解 一棵子树内的顺序不影响其与其它子树合并时的答案,这一点与归并排序的思想非常相似 所以我们只需单独处理每个节点的两棵子树所产生的最少逆序对即可 只有两种情况,要么正序要 ...
- php-fpm: hundreds of seconds in the log
favoriteI have nginx+php-fpm web serverSo I've noticed in php5-fpm.log many strange lines:[03-Sep-20 ...
- 【数论】数论进阶-Preknowledge
数论进阶-Preknowledge 参考资料:洛谷网校2018夏季省选基础班SX-3数论进阶课程及课件 一.整除与取整除法 1.1 定义 1.整除 \(\forall~x,y~\in~Z^+,\) 若 ...