类型转换

隐式转换

  基本数据类型之间存在如下兼容关系:char is-a int, int is-a long, long ia-a float, float is-a double,并且 is-a 关系是传递的。

  一个低级数据类型对象总是优化转换为能换容纳得下它的最大值的、占用内存最少的高级类型对象。

  比如下面的重载函数,100如果转换为long就可以满足要求,编译器就不会转换为double。

  

void f(long l);
void f(double d);
f(100);  //必然调用f(long l),而不是f(double d);

  隐式转换的过程

double d1 = 100;    //1.先产生一个double的临时变量,100赋值给该变量作为其整数部分,2、将该临时变量赋值给d1,3、临时变量的销毁由编译器决定
int i = 100;
double d2 = i;//过程同上

  

  由于派生类和基类之间的 is-a 关系,可以直接将派生类对象转换为基类对象,这虽然会发生内存截断,但是无论从内存访问还是从转换结果来说都是安全的。这得益于C++的一个保证:派生类对象必须保证其基类子对象的完整性,即其中的基类子对象的内存映像必须和真正的基类对象的内存映像一致。

  标准C语言允许任何非void类型指针和void类型指针之间进行直接的相互转换。但在C++中,可以把任何类型的指针直接指派给void类型指针,因为void*是通用指针;但是不能反过来,除非强制转换。

  标准C语言虽然可以,但这样隐藏着不易察觉的安全问题(内存扩张和截断)。

强制转换

  

类型转换函数

具体内容见《高质量程序设计指南》 P262

explicit 关键字

用于构造函数,要求用户必须显示调用该构造函数,避免隐式转换!

参考:http://developer.51cto.com/art/201002/183398.htm

类型转换符

  • static_cast<dest_type>(src_obj),作用相当于C风格的强制转换,但是在多重继承的情况下,它会正确地跳转指针的值,而C风格的强制转换则不会调整;它可以遍历继承树来缺点src_obj与dest_type的关系,但是只在编译时进行(此所谓静态);如果使用它来做downcast操作,则会存在隐患。
  • const_cast<dest_type>(src_obj),用于去除一个对象的const/volatile属性
  • reinterpret_cast<dest_type>(src_obj),我们可以借助它把一个整数转换成一个地址,或者在任何两种类型的指针间转换。使用该运算符的结果很危险,请不要轻易使用。
  • dynamic_cast<dest_type>(src_obj),在运行时遍历继承树(类层次结构)来确定src_obj与dest_type的关系。
原文地址:https://www.cnblogs.com/zhehan54/p/5236912.html