C++类型转换和隐式类型转换

static_cast( expression )  
用于数值类型之间的转换,也可以用于指针之间的转换,编译时已经确定好,效率高,但须要自己保证其安全性。
(1)用于数值之间的转化, 可以在相关指针在void* 之间转换

char a;
int b = static_cast(a);
char c = static_cast(b);
char* pa = NULL;
int* pb = static_cast(pa);//error
char* pc = static_cast(pb);//error
void* p = = static_cast(pa);//原指针类型要先转换成void*,再转换成其他指针类型
pb = static_cast(p);
pc = static_cast(p);

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

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

   C++类型转换和隐式类型转换_第1张图片
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(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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 
本文链接:https://blog.csdn.net/qq_35886593/article/details/90691614

你可能感兴趣的:(c++)