在 C++ 中使用 static_cast 命令

Jinku Hu 2023年10月12日
  1. 使用 static_cast 显式转换 C++ 中的对象类型
  2. 使用 reinterpret_cast 在 C++ 中显式转换对象类型
在 C++ 中使用 static_cast 命令

本文将演示如何在 C++ 中使用 static_cast 的多种方法。

使用 static_cast 显式转换 C++ 中的对象类型

将对象转换为不同类型的操作称为 casting。根据语言规则,在 C++ 中存在隐式转换发生的情况,例如,数组到指针衰减。尽管如此,转换主要与用户发出的显式转换请求相关联。当我们将对象或表达式的值转换为不同类型时,我们强制编译器将给定类型与指向该对象的指针相关联。

有四种命名的显式转换操作:const_caststatic_castreinterpret_castdynamic_cast。这些操作是现代 C++ 语言的原生操作,并且比旧的 C 样式转换相对可读。强制转换通常是危险的,即使是有经验的程序员也会犯错误,但在必要时不应该阻止你使用这些转换操作。在本文中,我们仅概述 static_castreinterpret_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
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 创始人。Jinku 在机器人和汽车行业工作了8多年。他在自动测试、远程测试及从耐久性测试中创建报告时磨练了自己的编程技能。他拥有电气/电子工程背景,但他也扩展了自己的兴趣到嵌入式电子、嵌入式编程以及前端和后端编程。

LinkedIn Facebook

相关文章 - C++ Cast