码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-02-04 20:25:25      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:c++

【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)动作无法操作。







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

标签:c++

原文地址:http://blog.csdn.net/u013476464/article/details/43490879

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!