[c++基础] 四种类型转换和隐式类型转换

static_cast( expression )  

用于数值类型之间的转换,也可以用于指针之间的转换,编译时已经确定好,效率高,但须要自己保证其安全性。

(1)用于数值之间的转化, 可以在相关指针在void* 之间转换

    [c++基础] 四种类型转换和隐式类型转换_第1张图片


(2)在基类和派生类之间进行转换(必须是有继承关系的两个类之间)

上行转换:子类指针或引用转换成基类表示——安全

下行转换:基类指针或引用转换成子类表示——危险(没有动态类型检查


   [c++基础] 四种类型转换和隐式类型转换_第2张图片


dynamic_cast < type-id> ( expression)

只用于对象的指针和引用之间的转换,需要虚函数尤其是向下类型转换,是安全的。与static_cast不同,在下行转换,dynamic_cast会检查转换是否会返回一个被请求的有效的完整对象,否则返回值为NULL. 

检测在运行时进行,是基于RTTI数据信息的,运行时检测,安全,但是效率低。

  [c++基础] 四种类型转换和隐式类型转换_第3张图片

dynamic_cast 如何保证转换是安全的?

引入RTTI,其存储着类运行的相关信息,记录的类的名字和类的继承关系链。使得对象可以知道自己的名字以及在继承链中的位置。因为RTTI依赖于虚表,所以用dynamic_cast对应的类一定要有虚函数。


const_cast< type-id> ( expression)

这个转换类型操纵传递对象的const属性,或者是设置或者是移除:
代码:
class C {};
const C *a = new C;
C *b = const_cast(a);


reinterpret_cast< type-id> ( expression)

用在任意指针(或引用)类型之间的转换;以及指针与足够大的整数类型之间的转换;从整数类型(包括枚举类型)到指针类型,无视大小。



隐式类型转换

1)两种常用的实现隐式类类型转换的方式:

a、使用单参数的构造函数或N个参数中有N-1个是默认参数的构造函数

b、使用operator目标类型() const

 

例如:
class Rational {

public:
  ...
  operator double()const;                  // 转换Rational类成double类型
};

在下面这种情况下,这个函数会被自动调用:
Rational r(1,2);                           // r
的值是1/2 
double d = 0.5 *r;                         //
转换 r double,然后做乘法

 

(2) 避免隐式类型转换:单参数的构造函数或N个参数中有N-1个是默认参数的构造函数声明之前加上explicit






你可能感兴趣的:(C++基础复习)