条款二:最好使用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[10];
    int dosomething();

    funcptrArray[0] = &dosomething;//错误,类型不符
    funcptrArray[0] = reinterpret_cast<funcptr>(&dosomething);//可通过编译
}
时间: 2024-10-14 17:20:14

条款二:最好使用c++转型操作符的相关文章

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

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

C++提供了four cast operators: static_cast,const_cast,dynamic_cast and reinterpret_cast. 1. static_cast 用来进行基本类型数值间的转换,例如:int --- char,安全由程序员进行控制. 不能用于无关类型间指针间的转换,例如:int* --- double* 编译出错. 将null pointers – other pointers. 基类和派生类之间指针或者引用的转换.up-casting (把派

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

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

Effective C++ 阅读笔记_条款27 尽量少做转型动作

Effective C++ 阅读笔记_条款27 尽量少做转型动作 1.转型的三种形式,可以分为两大类. (1)旧式转型(old-style casts) (1.1) (T) expresstion (1.2) T (expression) (2) 新式转型(c++-style casts) (2.1)const_cast<T> (expression) (2.2)dynamic_cast<T> (expression) (2.3)reinterpret_cast<T>

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

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

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

[c++转型操作符] goto语句一直被视为程序设计上的"贱民",低阶转型动作它有的一拼,虽然它任然能够苟延残喘,不过,旧式的C转型方式并非是唯一选择. 旧式转型的语法结构: 由一对小括号加上一个对象名称(标识符)组成,而小括号和对象名称在C++的任何地方都能够被使用,因此,我们简直无法回答最基本的转型相关问题"这个程序张有使用过任何转型动作吗?" <span style="font-size:18px;">(type)express

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 改变表达式中的常量性或变易性,常见用途是将某

HDU——1005Number Sequence(模版题 二维矩阵快速幂+操作符重载)

Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 148003    Accepted Submission(s): 35976 Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A

ISO/IEC 9899:2011 条款6.5.3——单目操作符

6.5.3 单目操作符 语法 1.unary-expression: postfix-expression ++  unary-expression --  unary-expression unary-expression    cast-expression sizeof    unary-expression sizeof    ( type-name ) _Alignof    ( type-name ) unary-operator:    以下之一 &    *    +    -