条款二:最好使用c++转型操作符
2024-09-30 18:20:02
一、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);//可通过编译
}
最新文章
- 更改Visual Studio 2015 默认的语言设置
- python 获取星期几
- Sharepoint学习笔记—习题系列--70-573习题解析 -(Q35-Q39)
- Snapchat面经(师兄的)
- Python类和实例
- Windows7のping応答の設定
- MySQL的表分区(转载)
- spring 定义自己的标签 学习
- xntp的配置
- CentOS下编译安装Apache2(新)
- php处理表单中的复选框问题以及js实现全选
- 用PE安装操作系统时:无法创建新的系统分区 也无法定位现有系统分区 的解决办法
- 整理下git常用命令
- Python-10 字典dict
- windows 服务器同步互联网时间
- MYSQL常用函数(格式化函数)
- 将之前的Power idea公司的数据按照下图所示的格式在屏幕上显示出来。
- sdkbox 接facebook
- 《Linux内核设计与实现》第4章读书笔记
- how to configure logback for Mybatis to print my SQL