一、static_cast基本上拥有与c旧式转型相同的威力与意义,以及相同的限制,不能够移除表达式的常量性,const_cast负责这个功能

二、const_cast用来改变表达式中的常量性,如果将const_cast用于上述以外的用途,那么转型动作会被拒绝,主要是将某个变量的常量性去除掉,因为非const实参可以赋值给常量形参

普通形参加不加const限定符对实参没有影响,引用形参和指针形参前面没有const限定符时,实参必须是非const的,而前面有const限定符时对实参也没有什么影响。

原因在于实参的传递方式不同,函数中的形参是普通形参的时,函数只是操纵的实参的副本,而无法去修改实参,实参会想,你形参反正改变不了我的值,那么你有没有const还有什么意义吗?引用形参和指针形参就下不同了,函数是对实参直接操纵,没有const的形参时实参的值是可以改变的,这种情况下怎能用函数来操纵const实参呢。

class widget{};
class specialwidget:public widget{};
void update(specialwidget *psw){} int main() {
specialwidget sw;
const specialwidget &csw = sw;
update(&csw);//&csw是const类型指针,与形参类型不兼容,出错
update(const_cast<specialwidget*>(&csw));//正确
widget *pw = new specialwidget;
update(pw);//出错,类型不一致
update(const_cast<specialwidget*>(pw));//出错,const_cast只能调节类型限定符,无法进行继承体系的向下转型动作
update(static_cast<specialwidget*>(pw));//正确
}

三、dynamic_cast用来执行继承体系中安全的向下转型,它无法应用在缺乏虚函数的类型上,也不能改变类型的常量性.如果你想为一个不涉及继承体制的类型执行转型动作,可使用static_cast,要改变常量性,则必须使用const_cast.如果转型失败,会以一个null指针(当转型对象是指针)或一个exception(当转型对象是引用)表现出来

class widget{};
class specialwidget:public widget{};
void update(specialwidget *psw){} int main()
{
widget *pw;
update(dynamic_cast<specialwidget*>(pw));//错误,dynamic_cast的操作数必须包含多态类型
}

四、reinterpret_cast的最常用用途是转换函数指针类型,不具有移植性,某些情况下这样的转型可能会导致不正确的结果,所以应该尽量避免将函数指针转型。

int main()
{
typedef void(*funcptr) ();
funcptr funcptrArray[];
int dosomething(); funcptrArray[] = &dosomething;//错误,类型不符
funcptrArray[] = reinterpret_cast<funcptr>(&dosomething);//可通过编译
}

条款二:最好使用c++转型操作符的更多相关文章

  1. 新式转型操作符[条款9] --《C++必知必会》

    在旧式转型(cast)下面隐藏着一些见不得人的.鬼鬼祟祟的东西.他们的语法形式使其在一段代码中通常很难引起人们的注意,但它们可能会搞一些可怕的破坏活动,就好比你冷不丁被一个恶棍猛击一拳似的.让我们阐明 ...

  2. 【More Effective C++ 条款2】最好使用C++转型操作符

    C的转型方式存在以下两个缺点: 1)几乎允许你将任何类型转化为任何类型,不能精确的指明转型意图,这样很不安全 如将一个pointer-to-base-class-object转型为一个pointer- ...

  3. 【M2】最好使用C++转型操作符

    1.C语言中的转型操作符有两个问题: a.是个通用的转换操作符,也就是说,可以从一个类型转换到其他类型.通用必定是低效率和冗余的,因为要考虑很多情况. b.在代码中,难以辨认出哪些是类型转换. 2.C ...

  4. C++中的四种转型操作符

    在具体介绍C++中的四种转型操作符之前,我们先来说说旧式转型的缺点: ①它差点儿同意将不论什么类型转换为不论什么其它类型,这是十分拙劣的.假设每次转型都可以更精确地指明意图,则更好. ②旧式转型难以辨 ...

  5. 5.9 C++重载转型操作符

    参考:http://www.weixueyuan.net/view/6387.html 注意: 转型构造函数可以将其它类型的参数转换为类类型,如果我们要进行相反的转换过程,将类类型转换为其它数据类型, ...

  6. C++转型操作符

    转:http://www.cnblogs.com/hazir/archive/2012/04/14/2447251.html 旧式的C转型方式,几乎允许你将任何类型转换为任何其它类型,有其自身的缺陷, ...

  7. Effective C++ 条款二 用编译器替换预编译器

    /************************************************************************/ /* C++条款二:用编译器替换预编译器 */ / ...

  8. 读书笔记_Effective_C++_条款二十七:尽量少做转型动作

    有关转型的几种做法,已经在早些的博客中写过了.这里先简单回顾一下,再讲一讲effective中对之更深入的阐述. 转型可以按风格可以分成C风格转型和C++风格转型两大类,C风格转型很容易看到,因为我们 ...

  9. GO语言系列(二)- 基本数据类型和操作符

    一.文件名 & 关键字 & 标识符 1.所有go源码以.go结尾 2.标识符以字母或下划线开头,大小写敏感 3._是特殊标识符,用来忽略结果 4.保留关键字 二.Go程序的基本结构 p ...

随机推荐

  1. leetcode_865. Smallest Subtree with all the Deepest Nodes

    https://leetcode.com/problems/smallest-subtree-with-all-the-deepest-nodes/ 给定一颗二叉树,输出包含所有最深叶子结点的最小子树 ...

  2. Beta冲刺提交-星期五

    Beta冲刺提交-星期五 这个作业属于哪个课程 软件工程 这个作业要求在哪里 <作业要求的链接> 团队名称 唱跳RAP编程 这个作业的目标 1.进行每日例会,每个成员汇报自己今天完成    ...

  3. 【JavaScript从入门到精通】第一课

    第一课 初探JavaScript魅力-01 JavaScript是什么 如今我们打开一个大型的网站,都会有很多JS效果的功能和应用.对于学过CSS+HTML的同学,即使是像淘宝那样的网站,用一两天时间 ...

  4. hdfs深入:03、hdfs的架构以及副本机制和block块存储

    HDFS分布式文件系统设计目标 1.            硬件错误  由于集群很多时候由数量众多的廉价机组成,使得硬件错误成为常态 2.            数据流访问  所有应用以流的方式访问数 ...

  5. 根据数据库表自动生成实体类、xml和dao---mybatis

    网盘链接: https://pan.baidu.com/s/1AVGz0bDa_Y5zjk7vXa2eHw 提取码: 2gr6 1.记事本打开generatorConfig.xml文件 2(1,2,3 ...

  6. [GXOI/GZOI2019]与或和(单调栈)

    想了想决定把这几题也随便水个解题报告... bzoj  luogu 思路: 首先肯定得拆成二进制30位啊 此后每一位的就是个01矩阵 Q1就是全是1的矩阵个数 Q2就是总矩阵个数减去全是0的矩阵个数 ...

  7. db2数据库,表相乘,直接扩大表数据

    T1 表 SEQ表 想得到结果集为: 语句: SELECT * FROM (SELECT * FROM seq,t1) u LEFT JOIN t1 ON u.id=t1.id AND u.jjh=t ...

  8. winform 实现两个datagridview之间的数据联动

    再做数据库开发的时候,经常会遇到表带上明细表,比如,一个学校有好多系,每个系又有好多专业.... 在winform中,都会使用datagridview来显示数据,现在就来说说如何实现之间的联动.比如现 ...

  9. mysql 删除数据重复的记录

    delete from user where id not in ( select * from ( select min(id) from user group by username,email ...

  10. linux目录文件操作

    一.linux系统目录结构 1.顶层根目录 顶层根目录使用 “/”来表示 2.linux中的一些重要目录 (1)bin目录 放置常用的可执行文件(其中ls命令位列其中) (2)sbin目录 放置系统的 ...