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

static_cast<type-id >( expression )  

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

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

   


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


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

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


   

dynamic_cast < type-id> ( expression)

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

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

  

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

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


const_cast< type-id> ( expression)

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

猜你喜欢

转载自blog.csdn.net/qq_35886593/article/details/90691614
今日推荐