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)动作无法操作。
时间: 2024-10-10 17:19:11

C++ 转型操作符 【1】static_cast 和const_cast的相关文章

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

在详细介绍C++中的四种转型操作符之前,我们先来说说旧式转型的缺点: ①它几乎允许将任何类型转换为任何其他类型,这是十分拙劣的.如果每次转型都能够更精确地指明意图,则更好. ②旧式转型难以辨识.旧式转型的语法结构是由一对小括号加上一个对象名称组成,而小括号和对象名称在C++的任何地方都有可能被使用. 为解决C旧式转型的缺点,C++导入了4个新的转型操作符:static_cast.const_cast.dynamic_cast.reinterpret_cast.下面我来一一分析这四种转型操作符.

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

1. C转型操作几乎允许将任何类型转为任意其他类型,由此造成极大地不安全性. 2. C转型操作对所有种类的转型使用一种语法,降低了代码的可读性.而C++的转型操作符则适用于更集中(狭窄)的目的. 3. C++的转型操作符: static_cast:几乎与C旧式转型相同的威力与意义以及相同的限制 const_cast:用于去除某个对象的常量性 用法:A* a=const_cast<A*>(&a1)       //a1是与A类型的对象 注意: 1)可以使用一个const对象经过const

C++转型操作符

虽然C++兼容旧式C语言转型的方式,但推荐统一使用C++新型的4个转型操作符:static_cast, const_cast, dynamic_cast, reinterpret_cast. 1. static_cast c旧时转型形式应采用static_cast来转换,其基本上具有与c旧式转型的功能: (type) expression     →→     static_cast<type> (expression) 2. const_cast 改变表达式中的常量性或变易性,常见用途是将某

条款2:最好使用C++转型操作符

旧式的C语言转型方式,是存在缺点的,主要在一下两个方面:1.它几乎允许你将任何类型转换为任何其它类型.2.转型是难以识别的.旧式转型的语法结构是由一对小括号加上一个对象名称组成,而小括号和对象名称在C++的任何地方都有可能被使用. 为了解决C旧式转型的特点,C++引入4个新的转型操作符(cast operators):static_cast, const_cast, dynamic_cast和reinterpret_cast. static_cast基本上拥有与C旧式转型相同的威力与意义,以及相

条款二:最好使用c++转型操作符

一.static_cast基本上拥有与c旧式转型相同的威力与意义,以及相同的限制,不能够移除表达式的常量性,const_cast负责这个功能 二.const_cast用来改变表达式中的常量性,如果将const_cast用于上述以外的用途,那么转型动作会被拒绝,主要是将某个变量的常量性去除掉,因为非const实参可以赋值给常量形参 普通形参加不加const限定符对实参没有影响,引用形参和指针形参前面没有const限定符时,实参必须是非const的,而前面有const限定符时对实参也没有什么影响.

static_cast, dynamic_cast, const_cast探讨

C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为"标准转换",包括以下几种情况:1) 算术转换(Arithmetic conversion) : 在混合类型的算术表达式中, 最宽的数据类型成为目标转换类型. int ival = 3;double dval = 3.14159;ival + dval;//ival被提升为double类型 2)一种类型表达式赋值给另一种类型的对象:目标类型是被赋值对象的类型 int *pi = 0; // 0被转化为int

static_cast, dynamic_cast, const_cast

[C++专题]static_cast, dynamic_cast, const_cast探讨 首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为"标准转换",包括以下几种情况:1) 算术转换(Arithmetic conversion) : 在混合类型的算术表达式中, 最宽的数据类型成为目标转换类型. int ival = 3;double dval = 3.14159; ival + dval;//ival被提升为doubl

static_cast 、const_cast、dynamic_cast、reinterpret_cast 关键字简单解释

static_cast .const_cast.dynamic_cast.reinterpret_cast 关键字简单解释: Static_cast 静态类型转换 ①用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换. 进行上行转换(把派生类的指针或引用转换成基类表示)是安全的: 进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的. ②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum.这种转换的安全性也要开发人员来保

dynamic_cast、static_cast、const_cast和reinterpret_cast的区别

           C++的类型转换分为两种:隐式转换和显示转换. 一. 对于隐式转换,就是标准的转换,在很多时候,不经意间就发生了,例如int和float加法,int类型就会被隐式转换为float了,这种称为升级转换.还有就是把等号右边的值转换为左边的类型,再赋值.还有类变量作为参数传递给函数: class B { public: int num; B(int a) { num=a; } } B show(B b) { return b; } show(5);//这里也发生了隐式转换,将5转