2023-2-19-什么是static_cast

简介: 2023-2-19-什么是static_cast

static_cast

在C++中强制类型转换存在四种方式,分别是static_cast、const_cast、rinterpret_cast和dynamic_cast。前三种对应这在c语言中旧式的强制类型转换,这篇文章讲解一下static_cast

static_cast关键字主要用于以下集中情况:

1)基本类型之间的转换,但不能用于基本类型指针之间的类型转换(void指针和基本类型指针之间可以

例如:

double d=0;
 int i=static_cast<int>(d);

2)用于有继承关系的子类与父类之间的指针或引用的转换

3)空类型指针转换为任意基本类型的指针

第三条是这里面很容易出错,因为有可能出现未知的转换结果,要保证转换的正确性就必须保证转换后所得的类型就是指针原先的类型。

先看一个转换正确的例子

代码如下:

int i=0;
void *vp=&i;
int *p=static_cast<int*>(vp);
*p=3;
cout<<i<<endl;

输出结果是 3

我们分析一下: i的初始类型为int 然后我们将i的地址转换为void*,然后void指针vp转换为int指针,此时int型指针 p和vp指向的i的原始类型int一致,所以转换结果正确。

接下来再看几个错误的例子

例1:

代码如下:

int  i=3;
void *vp=&i;
char *p=static_cast<char*>(vp);
*p=4
cout<<i<<endl;

输出结果是 4

我们分析一下:初看来我们的结果是正确的,但是这里实际是有错误的,或者说是不安全的转换。考虑如下代码:

int  i=256;
void *vp=&i;
char *p=static_cast<char*>(vp);
*p=4;
cout<<i<<endl;

输出结果是 260

这是为什么呢,让我们来分析一下。上面的两个例子都是错误的,原因就在于,最后转换的类型与数据的初始类型是不一样的,但是为什么输出结果一个正确,一个却是错误的呢。原因就在于不同的数据类型占用的字节数是不一样的,在我的机器里char是一个字节也就是8位,int是4字节,也就是32位,在第一个例子里3的二进制是0…0 0000 0011,那么在转换为char指针时实际指向低8位数据空间,也就是00000011所在位置,然后经过p=4以后,变为00000100,因此数据i的二进制就变成了0…0 0000 0100 ,也就是4,虽然结果没错,但是是不安全的,而第二个例子就体现了不安全。
同样对第二个例子进行分析。256的二进制是0000 0000 0000 0000 0000 0001 0000 0000,转换后char指针仍然指向低8位所在的数据空间,也就是0000 0000所在位置,然后经过
p=4以后,变为00000100,因此数据i的二进制就变成了0000 0000 0000 0000 0000 0001 0000 0100,转换成十进制就是260。

接下来再看一个例子

int  i=4294967294;
void *vp=&i;
double *p=static_cast<double*>(vp);
*p=4;
cout<<i<<endl;

输出结果是0

这里出现错误同样是和上面的两个例子一样,之所以结果是0,我个人的理解是由于浮点型表示形式不同所导致的。


目录
相关文章
|
2月前
|
编译器 C语言 C++
类型转换const_cast/static_cast/dynamic_cast/reinterpret_cast
类型转换const_cast/static_cast/dynamic_cast/reinterpret_cast
38 0
|
7月前
|
人工智能 机器人 测试技术
【C++】static_cast基本用法(详细讲解)
【C++】static_cast基本用法(详细讲解)
163 0
|
6月前
|
安全 程序员 编译器
static_cast与dynamic_cast到底是什么?
该文讨论C++中`static_cast`和`dynamic_cast`在处理子类与父类指针转换的情况。总结如下: 1. `static_cast`父类转子类:可能不安全,但不会报错。 2. `static_cast`子类转父类:安全,无错误。 3. `dynamic_cast`父类转子类:若父类有虚函数,运行时检查,成功返回子类指针,失败则为`nullptr`。 4. `dynamic_cast`子类转父类:安全,无错误。
|
7月前
|
安全 编译器 程序员
【C++入门到精通】C++类型的转换 | static_cast | reinterpret_cast | const_cast | dynamic_cast [ C++入门 ]
【C++入门到精通】C++类型的转换 | static_cast | reinterpret_cast | const_cast | dynamic_cast [ C++入门 ]
71 0
|
7月前
|
安全 编译器 C语言
【C++ 类型转换关键字 *_cast 】理解const_cast、reinterpret_cast、dynamic_cast和static_cast的用法
【C++ 类型转换关键字 *_cast 】理解const_cast、reinterpret_cast、dynamic_cast和static_cast的用法
93 0
|
7月前
|
安全 编译器 程序员
[C++ 从入门到精通] 6.static_cast、dynamic_cast等显示类型转换
[C++ 从入门到精通] 6.static_cast、dynamic_cast等显示类型转换
108 0
|
安全 C++
C++11之强制类型转换(static_cast,const_cast,dynamic_cast,reinterpret_cast)
C++11之强制类型转换(static_cast,const_cast,dynamic_cast,reinterpret_cast)
125 0
|
安全 C++ 编译器
static_cast, dynamic_cast, const_cast探讨
首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 何时发生隐式类型转换 在下面这些情况下,编译器会自动地转换运算对象的类型: 在大多数表达式中,比int类型小的整型值首先提升为较大的整数类型 在条件中,非布尔值转换为布尔类型 ...
1149 0