static_cast 基本上拥有与C旧式转型相同的威力与意义,以及相同的限制。不能够移除表达式的常量性(constness)
const_cast用来改变表达式中的常量性(constness)或易变性(volatileness)
const_cast 最常见的用途就是将某个对象的常量性去除掉
dynamic_cast 将"指向base class objects的pointers或references"转型为"指向dervied(或sibing base)class objects的pointers或references”,并得知转型是否成功。如果转型失败,会以一个null指针(当转型对象是指针)或一个exception(当转型对象是references)表现出来。
Reinterpret_cast的最常用用途是转换“函数指针”类型,平台相关不具移植性,尽量避免使用。
/***************************
more effectivre c++
35个改善编程与设计的有效方法
条款1:最好使用C++转型操作符
---------小鱼号的代码日记--------------
****************************/
/*****************************************
Static_cast 基本上拥有与C旧式转型相同的威力与意义,以及相同的限制。
不能够移除表达式的常量性(constness)
Const_cast用来改变表达式中的常量性(constness)或易变性(volatileness)
const_cast 最常见的用途就是将某个对象的常量性去除掉
dynamic_cast 将"指向base class objects的pointers或references"转型为
"指向dervied(或sibing base)class objects的pointers或references”,
并得知转型是否成功。如果转型失败,会以一个null指针(当转型对象是指针)
或一个exception(当转型对象是references)表现出来。
Reinterpret_cast的最常用用途是转换“函数指针”类型
平台相关不具移植性,尽量避免使用。
*******************************************/
#include<iostream>
#include<vector>
using namespace std;
class Widget{
public:
virtual ~Widget(){}
};
class SpecialWidget:public Widget{
public:
virtual ~SpecialWidget(){}
};
void update(SpecialWidget *psw){}
void updateViaRef(SpecialWidget &rsw){}
int doSomething(){}
int main()
{
SpecialWidget sw; //sw是一个non_const对象
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()需要的却是SpceicalWidget*
///update(const_cast<SpecialWidget*>(pw));//错误!const_cast只能用来影响
//常量性或易变性,无法进行继承体系的
//向下(cast down)动作
///const_cast 最常见的用途就是将某个对象的常量性去除掉
update(dynamic_cast<SpecialWidget*>(pw));//很好,传给update()一个指针,指向pw
//所指的SpecialWidget
//如果pw真的指向这样的东西;否则传过去
//的将是一个null指针
updateViaRef(dynamic_cast<SpecialWidget&>(*pw));//很好,传给updateViaRef()的是pw
//所指的SpecialWidget
//如果pw真的指向这样的东西;否则传过去
//抛出一个exception。
///dynamic_cast 只能协助你巡航于继承体系中。它无法应用在缺乏虚函数的类型身上
/// 也不能改变类型的常量性
int firstNumber,seconeNumber;
///double result = dynamic_cast<double>(firstNumber)/seconeNumber;
// 错误!未涉及继承机制
{
const SpecialWidget sw;
///update(dynamic_cast<SpecialWidget*>(&sw));
//错误! dynamic_cast不能改变常量性
}
typedef void (*FuncPtr)(); //FuncPtr是个指针,指向某个函数。
//后者无须任何自变量,返回值为void
FuncPtr funcPtrArray[10]; //funcPtrArray是个数组 内有10个FuncPtrs
///funcPtrArray[0] = doSomething;
//错误!类型不符
funcPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething); //可以编译通过
///Reinterpret_cast的最常用用途是转换“函数指针”类型
///平台相关不具移植性,尽量避免使用。
return 0;
}
内容选自:
more effectivre c++
35个改善编程与设计的有效方法
网友评论