C++类型转换操作符---补充(8)《Effective C++》

来源:互联网 发布:流体力学软件fluent 编辑:程序博客网 时间:2024/05/17 21:48

C语言中提供了两种类型转换:
1)隐式类型转换:进行隐式类型转换;
2)显示类型转换:使用(type)expression或者type(expression)(PS:这种表示主要用于传递的参数是类类型而类的构造函数是explicit的)这种表示,由一堆小括号加上一个对象名称组成,难以辨识!
C++中为了解决C语言中的旧式类型转换,定义了4种新式类型转换,分别是:
1)static_cast;2)const_cast;3)dynamic_cast;4)reinterpret_cast。
下面分别介绍一下这4种类型转换操作符各自的意义:

1)static_cast(expression)

用来将expression类型转换为type-id类型,主要用于非多态类型之间的转换,主要可用于以下几种场合:

  • 类层次结构中,基类和子类之间指针和引用的转换;
  • 基本数据类型之间的转换;
  • void指针转化为目标类型的指针,极不安全;

PS:static_cast不能转换掉表达式中的const、volatile和__unaligned属性;

2)const_cast(expression)

const_cast可以将类型中的const、volatile和__unaligned属性移除,用于改变对象的初始属性;

3)dynamic_cast(expression)

用于将expression转换为new_type,new_type必须是类的指针,类的引用或者void*;new_type是类的指针还是引用主要取决于expression是类的指针还是引用,只能在继承体系中实施转型,并且要求基类具有虚函数(多态),主要用于执行类的上行转换和下行转换;
PS:
上行变换:将子类指针转换为父类指针;

class A{...};class B:public A{...};B* b=new B();A* a=dynamic_cast<A*>(b);

PS:上行变换也可能会遇到类似下面下行变换所遇到NULL问题,具体可以看看如下代码:

class A{...};class B:public A{...};class C:public A{...};class D:public B,public C{...};D* d=new D;A* a=dynamic_cast<A*>(d);

这种方式导致编译器不知道d是从B还是从C转换为A的,正确的做法是:

class A{...};class B:public A{...};class C:public A{...};class D:public B,public C{};D* d=new D;B* b=dynamic_cast<B*>(d);A* a=dynaic_cast<A*>(b);delete d;delte b;delete a;

下行变换:将父类指针转换为子类指针。

1)正确的下行变换:

class A{...};class B:public A{...};A* a=new B;B* b=dynamic_cast<B*>(a);delete a;delete b;

2)错误的下行变换

class A{...}clas B:public A{...}A* a=new A;B* b=dynamic_cast<B*>(a);//由于a指向的实际是A,并不是A的子类B,所以转换时候b=NULLdelete a;delete b;

对比上面两种类型的数据我们可以发现,使用dynamic_cast进行下行转换的时候,首先必须确保待变换的指针实际指向的是子类指针才可以进行下行转换,下行变换其实就是从基类指针转换为派生类指针。

4)reinterpret_cast(expression)

reinterpret_cast允许将任意的指针类型转换为其他任意的指针类型,同时也允许将任意的整型类型转化为任意的指针类型,或者将任意的指针类型转化为整型类型。

参考:http://www.jb51.net/article/55885.htm

原创粉丝点击