深入static_cast运算符
- 博客分类:
- 技术杂绘
深入static_cast运算符
2011年03月29日
学无止境,把这几年收藏的文章都晒出来,大家共享吧! 声明:早期转载的文章未标明转载敬请原谅,以后将陆续改过来,向原创者致敬! C++ , Direct3D, OpenGL, GPU,OGRE,OSG,STL, Lua, Python, MFC, Win32 (有问题可留言,部分网页看不到图片可网页另存为到本地再打开即可看到) 痞子龙3D编程 QQ技术交流群:32103634
本文下载地址:
http://bbs.sjtu.edu.cn/file/Apple/1200681928238350 .pdf
许可:
http://creativecommons.org/licenses/by-nc-nd/2.5/c n
作者:Robert Schmidt
Microsoft Corporation
2000年5月18日
译者:高博
http://www.gaobo.org
feedback@gaobo.org
依我数年在Usenet的C++新闻组的潜水经验来看,四个型别转换运算符:const_cast、dy
namic_cast、reinterpret_cast和static_cast之间究竟关系如何一直是软件工程师的困
扰之源。尤其是reinterpret_cast和static_cast的区别,对许多软件工程师而言十分模
糊--或者不如说简直是视而不见。在以下的两讲里,我会演示一下两者之间的区别,
并给出何时应该应用何者的指南。(译注:本文是讲了static_cast的第一讲。)
概览
顾名思义,static_casts将具有某种静态型别的表达式转换成具有另外某种静态型别的
对象或值。如C++标准(§2.5.9/1-3)(译注:原文误写为5.2.9)所言:
表达式static_cast(v)之结果就是将表达式v转换为型别T的结果。如果T是一个引用
型别,则结果为一个左值。否则,结果是一个右值。在一个static_cast表达式内不可定
义新的型别。static_cast运算符不会将表达式的常量性(constness)转换掉。
……
能够显式地使用形如"static_cast(e)"的static_cast表达式来转换为型别T的表达
式e必须满足:"T t(e);"对某个虚构的临时变量t是一个合式的声明。否则,static_c
ast表达式将执行下面列出的转换之一:
……
其它任何的型别转换都不能够显式地通过使用static_cast来实现。
这就是说,允许使用static_cast的场合包括:
.一个具有目标型别(转换后的型别)的对象能够直接以一个具有源型别(转换前的型
别)的值来初始化,或者
.此种转换符合某个标准§2.5.9中随后列举的例外情形之一(我随后会简要地一一说明
之)。
标准的§2.5.9还提及,static_cast运算符"不会将表达式的常量性转换掉"。标准实
际是说static_cast不会卸除CV-饰词(译注:即常量性--constness,饰词const和挥
发性--volatility,饰词volatile)。比如,static_cast运算符不可以把char
const *转换为char *,尽管它可以把char *转换为char const *。(如果你想要卸除CV
-饰词的话,唯一合用的型别转换运算是const_cast。我会在下面的一个更广义的讨论"
常量正确性"--const correctness的论文里作有关const_cast运算符的完整论述,此
去略去不提。)
例:
现有声明:
struct B{
operator int();
};
struct D : B{
};
B b;
float const f = 0;
下面的型别转换:
static_cast(&b); // 等价于"(void *) &b;"
static_cast(b); // 等价于"(int) b;"和"int(b);"
都是合式的。第一个型别转换依赖于一个标准支持的从B *到void *的隐式型别转换,而
第二个则隐式调用了b.operator int()。两个型别转换都遵从了标准§2.5.9中描述的一
般规则。但正如我刚才提到的,它还列出了一些一般规则不能涵盖的例外。这些例外使
得以下的转换加入了被允许之列:
static_cast(f); // 等价于"(int) f;"和"int(f);"
static_cast(b); // 等价于"(D &) b;"
尽管这些转换的目标型别对象是不能用源型别的值来初始化的。
最后,看看这对表达式:
static_cast(&f); // 没问题
static_cast(&f); // 错误!
第一个转换成功完成了,但第二个可耻地失败了。它们都企图把一个指涉到float的指针
转换成一个指涉到int的指针,但是第二个转换把const饰词也转换掉了--这是标准大
声禁止的。第二个转换如果在老旧的型别转换语法里就能够畅行无阻:
(int *) &f; // 译注:没问题
隐式型别转换
标准的§2.5.9/1允许:
T t = static_cast(e);
当:
T t(e);
是合式的,亦即,直接的、无转型的初始化是可行的。这隐含了一层意思,就是声明:
long l = static_cast('x');
和
long l('x');
是等价的。你也许会对语言居然允许这样冗余的转型觉得古里古怪,就好像它们仅仅使
源代码显得更加
发表评论
-
Flash AS3 正则表达式
2012-01-20 02:24 1022Flash AS3 正则表达式 2010 ... -
红黑树算法的实现与剖析
2012-01-20 02:24 664红黑树算法的实现与剖析 2011年03月28日 学无止境 ... -
动态规划算法
2012-01-20 02:24 623动态规划算法 2011年03 ... -
GPGPU将取代CPU?抢CPU “饭碗”
2012-01-20 02:24 698GPGPU将取代CPU?抢CPU “饭碗” 2011年03月 ... -
学习英语的方法
2012-01-19 10:14 559学习英语的方法 2011年02月16日 ... -
学英语
2012-01-19 10:14 624学英语 2011年09月07日 学英语有诀窍,一是方法, ... -
从母语学习规律中推断出英语学习的规律
2012-01-19 10:13 866从母语学习规律中推断出英语学习的规律 2011年08月17日 ... -
显卡的构成
2012-01-17 02:54 734显卡的构成 2011年06月18日 显卡的基本构成 ... -
[SU] 如何使SketchUp跑得更快(上)――专业教程系列
2012-01-17 02:54 834[SU] 如何使SketchUp跑得更快(上)――专业教程系列 ... -
平板电脑的各方案主控比较
2012-01-17 02:54 1052平板电脑的各方案主控比较 2011年09月17日 ARM ... -
高端ARM微处理器芯片性能比较(图片版)
2012-01-17 02:54 1548高端ARM微处理器芯片性能比较(图片版) 2010年12月1 ... -
转帖】2011年MID主控展望――后A8时代与A9的到来处理器
2012-01-17 02:54 900转帖】2011年MID主控展望 ... -
如何让AD用户密码在快过期时,发邮件提醒用户更改密码
2012-01-15 22:32 1391如何让AD用户密码在快过期时,发邮件提醒用户更改密码 201 ... -
自动上传FTP脚本
2012-01-15 22:32 1028自动上传FTP脚本 2011年05月11日 自动上传本地 ... -
书80~81页代码
2012-01-15 22:32 586书80~81页代码 2011年04月20日 read.a ... -
AS3 CookBook学习整理(三)
2012-01-15 22:32 614AS3 CookBook学习整理(三) 2009年10月06 ... -
【FLASH实例1000教程】(4)上
2012-01-15 22:32 1033【FLASH实例1000教程】(4) ...
相关推荐
使用标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast。 const_cast,字面上理解就是去const属性。 static_cast,命名上理解是静态类型转换。如int转换成char。 dynamic_cast,...
本文详细介绍了C++中的四个用与强制类型转换的运算符:用来修改类型的const 或volatile 属性的const_cast,用来修改操作数类型的reinterpret_cast,static_cast,dynamic_cast
dynamic_cast 运算符 将操作数 expression 转换成类型为type-id 的对象。 语法 dynamic_cast < type> ( expression ) 备注 type-id 必须是一个指针或引用到以前已定义的类类型的引用或“指向 void 的指针”。如果 ...
static_cast; reinterpret_cast; 一、dynamic_cast 该运算符我在之前的文章中已经介绍过了 //www.jb51.net/article/123252.htm 总之,该运算符的语法如下: dynamic_cast < type> (expression) 如果转型失败则...
使用标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast。 1、static_cast 用法:static_cast (expression) 该运算符把expression转换为type-id类型,但没有运行时类型检查来...
const_cast,reinterpret_cast,static_cast,dynamic_cast等等。 1)static_cast(a) 将地址a转换成类型T,T和a必须是指针、引用、算术类型或枚举类型。 表达式static_cast(a), a的值转换为模板中...
const_cast,reinterpret_cast,static_cast,dynamic_cast等等。 1)static_cast(a) 将地址a转换成类型T,T和a必须是指针、引用、算术类型或枚举类型。 表达式static_cast(a), a的值转换为模板中...
static_cast和reinterpret_cast #和## 构造函数和拷贝构造函数 类型转换问题 指针悬挂问题 运算符重载等等
在阅读<<C>>的时候,在for_each()章节遇到下面代码, #include "algostuff.hpp" class MeanValue{ private: long num; long sum; ... MeanValue():num(0),sum(0){ ... return static_cast(sum) / static_cast(num)
用法:static_cast < type> ( expression )该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。 ①用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。 ...
15_c++中的三目运算符_传智扫地僧 16_const的基础和const符号表机制探究_传智扫地僧 17_const和#define的对比_传智扫地僧 18_引用的基础知识(定义和函数参数) 19_复杂数据类型引用做函数参数__传智扫地僧 20_引用的...
21.3 static—cast运算符 21.4 const—cast运算符 21.5 reinterpret—cast运算符 21.6 名字空间 21.7 运行时类型信息(RTTI) 21.8 运算符关键字 21.9 explicit构造函数 21.10 mutable类成员 21.11 类成员...
21.3 static—cast运算符 21.4 const—cast运算符 21.5 reinterpret—cast运算符 21.6 名字空间 21.7 运行时类型信息(RTTI) 21.8 运算符关键字 21.9 explicit构造函数 21.10 mutable类成员 21.11 类成员...
1) static_cast:和C风格转换相似可做值的强制转换,或指针的父类到子类的明确的向上转换; 2) const_cast:移除const属性; 3) reinterpret_cast:指针类型和整型或其他指针间不安全的相互转换,仅在你对所做一切...
可以用运算符“= =”和“!=”来互相比较这些对象。也可以用n a m e ( )来 获得类型的名称。注意,如果给t y p e i d ( )传递一个s h a p e *型参数,它会认为类型为s h a p e *,所以如 果想知道一个指针所指对象的...
Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,已经帮助全球无数程序员学会了C++。 对C++基本概念和技术全面而且权威的阐述,对现代C++编程风格的强调,使本书成为C++...
Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,已经帮助全球无数程序员学会了C++。 对C++基本概念和技术全面而且权威的阐述,对现代C++编程风格的强调,使本书成为C++...
setter,方法重载,Random,cast,toString,从Strings转换为基本体,从Primitives转换为Strings,如果是,则为print,println,printf,逻辑运算符,比较运算符,三元运算符, while,break,continue,do while,...
目 录 译者序 前言 第1章 对象的演化 1.1基本概念 1.1.1对象:特性十行为 ...18.9.1staticcast 18.9.2constcast 18.9.3reinterpret_cast 18.10小结 18.11练习 附录A 其他性能 附录B 编程准则 附录C 模拟虚构造函数