条款二:最好使用c++转型操作符
一、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);//可通过编译
}
条款二:最好使用c++转型操作符的更多相关文章
- 新式转型操作符[条款9] --《C++必知必会》
在旧式转型(cast)下面隐藏着一些见不得人的.鬼鬼祟祟的东西.他们的语法形式使其在一段代码中通常很难引起人们的注意,但它们可能会搞一些可怕的破坏活动,就好比你冷不丁被一个恶棍猛击一拳似的.让我们阐明 ...
- 【More Effective C++ 条款2】最好使用C++转型操作符
C的转型方式存在以下两个缺点: 1)几乎允许你将任何类型转化为任何类型,不能精确的指明转型意图,这样很不安全 如将一个pointer-to-base-class-object转型为一个pointer- ...
- 【M2】最好使用C++转型操作符
1.C语言中的转型操作符有两个问题: a.是个通用的转换操作符,也就是说,可以从一个类型转换到其他类型.通用必定是低效率和冗余的,因为要考虑很多情况. b.在代码中,难以辨认出哪些是类型转换. 2.C ...
- C++中的四种转型操作符
在具体介绍C++中的四种转型操作符之前,我们先来说说旧式转型的缺点: ①它差点儿同意将不论什么类型转换为不论什么其它类型,这是十分拙劣的.假设每次转型都可以更精确地指明意图,则更好. ②旧式转型难以辨 ...
- 5.9 C++重载转型操作符
参考:http://www.weixueyuan.net/view/6387.html 注意: 转型构造函数可以将其它类型的参数转换为类类型,如果我们要进行相反的转换过程,将类类型转换为其它数据类型, ...
- C++转型操作符
转:http://www.cnblogs.com/hazir/archive/2012/04/14/2447251.html 旧式的C转型方式,几乎允许你将任何类型转换为任何其它类型,有其自身的缺陷, ...
- Effective C++ 条款二 用编译器替换预编译器
/************************************************************************/ /* C++条款二:用编译器替换预编译器 */ / ...
- 读书笔记_Effective_C++_条款二十七:尽量少做转型动作
有关转型的几种做法,已经在早些的博客中写过了.这里先简单回顾一下,再讲一讲effective中对之更深入的阐述. 转型可以按风格可以分成C风格转型和C++风格转型两大类,C风格转型很容易看到,因为我们 ...
- GO语言系列(二)- 基本数据类型和操作符
一.文件名 & 关键字 & 标识符 1.所有go源码以.go结尾 2.标识符以字母或下划线开头,大小写敏感 3._是特殊标识符,用来忽略结果 4.保留关键字 二.Go程序的基本结构 p ...
随机推荐
- VUE 入坑系列 一 基础语法
html代码 <div id="app"> {{message}} </div> JavaScript代码 var vm = new Vue({ el: & ...
- .NET Core MVC Web最最最基础的框架搭建
1. 使用VS创建.NET Core MVC Web项目 创建完成就是酱紫的了 2. 用NuGet把这些全部都安装了 Install-Package Microsoft.EntityFramework ...
- 洛谷 P1339 [USACO09OCT]热浪Heat Wave (堆优化dijkstra)
题目描述 The good folks in Texas are having a heatwave this summer. Their Texas Longhorn cows make for g ...
- ansible配置mysql主从复制
配置主机1.下载安装所需安装包 [root@server1 ansible]# lsansible-2.7.8-1.el7.noarch.rpmansible-tower-setup-bundle-3 ...
- col - 过滤掉输入中的反向换行符
SYNOPSIS(总览) col [-bfx ] [ Fl l Ar num ] DESCRIPTION(描述) Col 过滤掉反向(以及半反向)换行符(LF: line feed or NL: ne ...
- viewstate 与 session 区别
Session存在于服务器端可以跨页面.耗费服务器资源.ViewState载体是页面文件,消耗带宽. EG: viewstate是存储在客户端的隐藏信息,当服务器接受请求回传时可以将viewstate ...
- 快速创建你xmlhttp的方法
function initxmlhttp() { var xmlhttp try { xmlhttp=new ActiveXObject("Msxml2.XM ...
- Qt的widget与Button添加图片
ui.widget->setAutoFillBackground(true); QImage image; QPalette palette; image.load("D:\\Work ...
- python装饰器、迭代器、生成器
装饰器:为已存在的函数或者或者对象添加额外的功能 def wrapper(f): #装饰器函数,f是被装饰的函数 def inner(*args,**kwargs): '''在被装饰函数之前要做的事' ...
- ubuntu Android Studio以及SDK安装
先使用迅雷下载linux版的Android Studio以及SDK,下载地址是https://dl.google.com/dl/android/studio/ide-zips/1.1.0/androi ...