C++之四个强制类型转换

来源:互联网 发布:sqlserver列明别名 编辑:程序博客网 时间:2024/06/05 14:27

如果两种类型相关,则可在需要某种类型的操作数位置上,使用该类型的相关类型对象或值。如果两个类型之间可以相互转换,称这两个类型相关。

强制类型转换,又叫显式转换,包括四个操作符:static_cast、dynamic_cast、const_cast、reinterpret_cast。

一般形式:cast_name<type>(expression);

cast_name:为四种类型转换之一

type:转换的目标类型

expression:被强制转换的值。

1、dynamic_cast

dynamic_cast用于类继承层次间的指针或引用转换。主要还是用于执行“安全的向下转型(safe downcasting)”,也即是基类对象的指针或引用转换为同一继承层次的其他指针或引用。至于“先上转型”(即派生类指针或引用类型转换为其基类类型),本身就是安全的,尽管可以使用dynamic_cast进行转换,但这是没必要的, 普通的转换已经可以达到目的,毕竟使用dynamic_cast是需要开销的。

不同于其它的强制类型转换,dynamic_cast在运行时会进行类型检查,如果绑定到引用或指针的对象不是目标类型的对象,则dynamic_cast失败:

  • 对指针进行dynamic_cast,失败返回null,成功返回正常cast后的对象指针; 
  • 对引用进行dynamic_cast,失败抛出一个异常,成功返回正常cast后的对象引用。 

注意:dynamic_cast在将父类cast到子类时,父类必须要有虚函数。

2、const_cast

转换掉表达式的const性质。例如,假设有函数string_copy,我们对其唯一的char*类型的参数只读不写。在访问该函数时,最好的选择是修改它让它接受const char*类型的参数。如果不行,可通过const_cast:

const char * pc_str;char *pc = string_copy(const_cast<char*>(pc_str) );
使用const_cast将const性质转换掉。

除了添加或删除const特性,用const_cast符来执行其它类型转换,都会引起编译错误。
3、static_cast

编译器隐式执行的任何类型转换都可以由static_cast显式完成:

double d = 29.70;char ch = static_cast<char>(d); 

当需要将一个较大的算术类型赋值给较小的类型时,使用强制类型转换非常有效。此时,强制类型转换告诉程序的读者和编译器:我们知道并且不关心潜在的精度损失。对于从一个较大的算术类型到一个较小类型的赋值,编译器通常会产生警告。当显示提供强制类型转换时,警告信息会被关闭。

如果编译器不提供自动转换,使用static_cast也是非常有用的。例如:可通过static_cast将存放在void*中的指针值强制转换为原来的指针类型:

void * p = &d;double * dp = static_cast<double*>(p);
4、reinterpret_cast

static_cast 运算符完成*相关类型*之间的转换. 而 reinterpret_cast 处理*互不相关的类型*之间的转换.

"互不相关的类型"指的是两种完全不同的类型,如从整型到指针类型,或者从一个指针到另一个毫不相干的指针.

所以 reinterpret_cast 常常被用作不同类型指针间的相互转换,因为所有类型的指针的长度都是一致的(32位系统上都是4字节),按比特位拷贝后不会损失数据.

0 0