C++的四种操作符:static_cast,dynamic_cast,reinpreter_cast,const_cast

对于具有转换的简单类型而言,C类型转型基本够用。然而,对于类(class)和类的指针,C类型转换符不能随意使用。ANSI-C++标准定义了四个新的转换符:reinterpret_cast, static_cast, dynamic_cast和const_cast,目的在于控制类(class)之间的类型转换。

1、static_cast<type-id> (expression)

该运算符将expression转换为type-id类型,运行时没有类型检查来保证转换的安全性。它允许执行任意的隐式转换和相反转换动作。主要有如下几种用法:

1)用于基本数据类型之间的转换,如把int转换成char,non-const 对象转型为 const 对象(这里相反方向不可以,C++只有const_cast可以)。
2)把空指针转换成目标类型的指针。(之前的做法是用强制转换(type-id*))
3)把任何类型的表达式转换成void类型。
4)应用到类的指针上,它允许子类类型的指针转换为父类类型的指针(upercasting这是一个有效的隐式转换);也    能够执行相反动作,即转换父类为它的子类(downcasting),这种转换的安全性需要开发人员来保证(主要是在    非上下转型中)。
     class Base {};
     class Derived : public Base {};
     Base *a = new Base;
     Derived *b = NULL;
     b = static_cast<Derived *>(a); //可以通过编译,但存在安全隐患(如访问//Derived的成员)

2、dynamic_cast<type-id> (expression)

该运算符把expression转换成type-id类型的对象,type-id必须是类的指针,类的引用或void *;如果type-id是类指针类型,那么expression也必须是一个指针。如果type-id是一个引用,那么expression也必须是一个引用。具有类型检查功能。比static_cast安全,dynamic_cast支持交叉转换。

3、reinpreter_cast<type-id> (expression)

type-id必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,再把该整数转换成原类型的指针,还可以得到原先的指针值)。

4、const_cast<type-id> (expression)

该运算符用来修改类型的const或volatile属性。除了const或volatile修饰之外,type-id和expression的类型是一样的。常量指针被转化成非常量指针,并且仍然指向原来的对象;常量引用被转换成非常量引用,并且仍然指向原来的对象。常量对象被转换成非常量对象。

参考:http://blog.csdn.net/starryheavens/article/details/4617637


猜你喜欢

转载自blog.csdn.net/winboyer/article/details/49123483