C++ 转型操作符 【1】static_cast 和const_cast

【c++转型操作符】

goto语句一直被视为程序设计上的“贱民”,低阶转型动作它有的一拼,虽然它任然能够苟延残喘,不过,旧式的C转型方式并非是唯一选择。

旧式转型的语法结构:

由一对小括号加上一个对象名称(标识符)组成,而小括号和对象名称在C++的任何地方都能够被使用,因此,我们简直无法回答最基本的转型相关问题“这个程序张有使用过任何转型动作吗?”

<span style="font-size:18px;">(type)expression</span>

因此,C++中导入了4个新的转型操作符(cast operators):static_cast , const_cast , dynamic_cast 和reinterpret_cast。 对于大部分使用目的而言,你只要掌握使用方法就好。 

换成C++方式,上面的代码就要改成:

static_cast<type>(expression)

举个例子,假设你想要将一个int转型成为一个double,以强迫一个整数表达式导出一个浮点数值来。采用C旧式转型,可以这么做:

int firstNumber,secondNumber;
...
double result = ((double)firstNumber)/secondNumber;

采用新的C++转型法,应该这么写:

double result = static_cast<double>(firstNumber)/secondNumber;

这种形式十分容易被辨识出来,不论是对人类还是对工具程序而言。


1、static_cast 基本上拥有与C旧式转型相同的威力,以及相同的限制。例如,你不能够利用static_cast将一个struct转型为int,或将一个double 转型为pointer ;这些就是C旧式转型动作原本就不可以完成的任务。static_cast 甚至不能够移除表达式的常量性(constness),这是因为有一个新的转型操作符const_cast 专司其职。


2、const_cast 用来改变表达式中的常量性(constness)或者变易性(volatileness),使用const_cast 是对编译器的强调,通过这个转型操作符,你唯一打算改变的是某物的常量性或变易性。这项意愿有编译器贯彻执行。

注意:如果你将const_cast 用于上述以外的用途,那么转型动作会被拒绝。

例如:

#include <iostream>
#include <string>
using namespace std;

class Widget {...}
class SpecialWidget:public Widget{...};
void update(SpecialWidget *psw);
SpecialWidget sw;                    //sw 是一个non-常对象
const SpecialWidget& csw = sw;       //csw 却是一个代表sw的reference,并且是一个const 对象

update(&csw);                        //错误!不能将const SpecialWidget* 传给需要 SpecialWidget*的函数

update(const_cast<SpecialWidget*>(&csw));   //可以,&csw的常量性被去除了,也正因为如此,csw(也是sw)在此函数中可以被改变


update((SpecialWidget*)&csw);        //c旧式转型方式,可以实现操作,但是


Widget *pw = new SpecialWidget;
update(pw);                          //错误!,pw是Widget*但是update()需要的确实SpecialWidget*类型。

update(const_cast<SpecialWidget*>(pw));    //错误!cons_cast 只能用来改变常量性和变易性,对于继承体系的向下转型(cast down)动作无法操作。







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值