C++语言中的四种类型转换
作者:网络转载 发布时间:[ 2015/8/5 11:01:44 ] 推荐标签:.NET 编程语言
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;
}
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11