在 C++ 中使用 static_cast 命令
本文将演示如何在 C++ 中使用 static_cast
的多种方法。
使用 static_cast
显式转换 C++ 中的对象类型
将对象转换为不同类型的操作称为 casting
。根据语言规则,在 C++ 中存在隐式转换发生的情况,例如,数组到指针衰减。尽管如此,转换主要与用户发出的显式转换请求相关联。当我们将对象或表达式的值转换为不同类型时,我们强制编译器将给定类型与指向该对象的指针相关联。
有四种命名的显式转换操作:const_cast
、static_cast
、reinterpret_cast
和 dynamic_cast
。这些操作是现代 C++ 语言的原生操作,并且比旧的 C 样式转换相对可读。强制转换通常是危险的,即使是有经验的程序员也会犯错误,但在必要时不应该阻止你使用这些转换操作。在本文中,我们仅概述 static_cast
和 reinterpret_cast
操作。
static_cast
函数通常用于将相关类型作为相同类层次结构或数字类型的指针相互转换。此命令还处理由构造函数和转换运算符定义的转换。请注意,main
函数中的第二行实际上是执行从有符号 char
到有符号整数的隐式转换,这只是下一行的隐藏版本。
这是在当代 C++ 中进行转换的推荐方法,即使结果是相同的。另一方面,main
函数的第四和第五行不是使用 static_cast
操作的有效转换。虽然,我们可以使用 C 风格的强制转换,(int*)x
,它以十六进制形式和内存地址表示法打印 97
整数值。请注意,此操作很可能会生成编译器警告。
#include <iostream>
using std::cout; using std::endl;
int main() {
char x = 'a';
int x_i = x;
int x_ii = static_cast<int>(x);
int* x_iii = static_cast<int*>(x); // ERROR
int* x_iii = static_cast<int*>(&x); // ERROR
int* x_iii = (int*)x; // WARNING
cout << x << endl;
cout << x_i << endl;
cout << x_ii << endl;
cout << x_iii << endl;
return EXIT_SUCCESS;
}
输出:
a
97
97
0x61
0x7ffeb7c31997
使用 reinterpret_cast
在 C++ 中显式转换对象类型
或者,可以使用以下代码示例中显示的 reinterpret_cast
操作完成后一种 C 样式转换。此方法将使编译器警告静音,并且用户可以对转换负责。我们可以使用 reinterpret_cast
将不同的指针类型转换为 char*
到 int*
。
在这种情况下,打印的地址与存储 x
字符的地址相同。请记住,如果我们取消引用 x_iii
指针以访问该值,我们将不会得到字符 a
或其 ASCII 替代,而是一个奇怪的整数。该整数是从同一位置检索的。只有数据类型的大小不同,因为它被解释为 int
。
#include <iostream>
using std::cout; using std::endl;
int main() {
char x = 'a';
int* x_i = (int*)x; // WARNING
int* x_ii = reinterpret_cast<int*>(x);
int* x_iii = reinterpret_cast<int*>(&x);
cout << x_i << endl;
cout << x_ii << endl;
cout << x_iii << endl;
return EXIT_SUCCESS;
}
输出:
0x61
0x61
0x7ffca18be95f
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn