关闭

C++语言中的四种类型转换

发表于:2015-8-05 09:22

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Peter87    来源:51Testing软件测试网采编

  1、引子
  这篇笔记是根据StackOverflow上面的一个问题整理而成,主要内容是对C/C++当中四种类型转换操作进行举例说明。在之前其实对它们都是有所了解的,而随着自己在进行总结,并敲了一些测试示例代码进行验证之后,对它们的理解又深刻了一些。
  总所周知,在C++ 当中引入了四种新的类型转换操作符:static_cast, dynamic_cast, reinterpret_cast,还有const_cast。就自己见过的一些C++代码当中,它们的使用其实并不普遍。不少程序员依然乐于去使用C-like的类型转换,因为它强大且编写起来又简单。据说C-Like类型转换操作符的作用实际上已经包括了static_cast, const_cast和reinterpret_cast三种操作符,你相信吗?一起来着看。
  注:上面提到的C-Like类型转换操作有如下的两种形式,这一点大家一定都不会陌生。
  (new-type) expression
  new-type (expression)
  2、static_cast vs dynamic_cast
  之所以把static_cast与dynamic_cast两兄弟放在一起是因为它们两者对比起来更容易记得住。首先,从名称上面它们就有语义相对的关系,一“静”一“动”。另外,在功能上面也在一定程度上体现了这一对比的特性,如dynamic_cast的Run-time Checkingt,static_cast在编译时增加的类型检测。简单而言:
  static_cast: 1)完成基础数据类型,2)同一个继承体系中类型的转换
  dynamic_cast:使用多态的场景,增加了一层对真实调用对象类型的检查
  2.1 从C-Like到static_cast
  static_cast对于基础类型如int, float, char以及基础类型对应指针的处理大多情况下恰如C-Like的转换一样,不过static_cast会来得更加安全。
  char c = 10;           // 1 个字节
  int *p = (int *)&c;    // 4 个字节(32bit platform)
  *p = 5;                // 内存踩脏
  int *q = static_cast<int *>(&c); // 使用static_cast可在编译阶段将该错误检查出来。
  对于自定义类型的处理,相比C-Like而言,它也多了一层保护,也就是它不支持在不属于同一继承体系的类型之间进行转换。但是C-Like就可以办到,看下面这个例子:
#include <iostream>
class A
{
public:
A(){}
~A(){}
private:
int i, j;
};
class C
{
public:
C(){}
~C(){}
void printC()
{
std::cout <<"call printC() in class C" <<std::endl;
}
private:
char c1, c2;
};
int main()
{
A *ptrA = new A;
//C *ptrC = static_cast<C *>(ptrA);
// 编译无法通过,提示:
// In function ‘int main()’:
// error: invalid static_cast from type ‘A*’ to type ‘C*’
C *ptrC = (C *)(ptrA);
ptrC->printC();
// 编译正常通过。
// 尽管这个时候能够正常调用printC,但实际上这种做法的结果是“undefined”
// 尝试过,如果添加一些数据成员的运算,这个时候将会使得运算结果无法预测
// 所以,在运行时候该逻辑相关的行为是不清晰的。
return 0;
  }
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号