C 语言 static_cast

2024 年 8 月 28 日 | 3 分钟阅读

引言

类型转换运算符是一种一元运算符,它要求将一种数据类型转换为另一种数据类型。

C++ 支持四种类型转换:

  • Static Cast (静态转换)
  • Dynamic Cast (动态转换)
  • Const Cast (常量转换)
  • Reinterpret Cast (重新解释转换)

在本文中,我们将深入探讨static_cast

Static Cast (静态转换)

最简单的转换是static_cast。它是一种在编译时进行的转换。它可以调用显式转换函数,也可以执行隐式类型转换(例如,int转换为float,或者pointer转换为void*)。

static_cast 的语法

static_cast 的语法如下:

Dest_type 将是 static_cast 的返回值。

static_cast 的一个示例

下面展示了实现static_cast 的 C++ 程序:

输出

The Value of a: 5
The Value of b: 5

不同场景下 static_cast 的行为

1. 原始数据类型引用的 Static_cast

现在我们稍微修改一下上面提到的代码。

输出

It will give us an error like;
error: invalid 'static_cast' from type 'char*' to type 'int*'

说明

这意味着 static_cast 将阻止您将一个对象指针类型转换为另一个,即使这样做是违法的。

2. 使用用户定义的转换运算符转换对象

如果定义了类的转换运算符,static_cast 可以调用它。再举一个对象与类之间相互转换的例子。

输出

Constructor is Called
now Conversion Operator is Called
Constructor is Called
now Conversion Operator is Called
Constructor is Called

说明

让我们逐行分析上面代码的输出。

  1. 当创建对象 (obj) 时,会调用构造函数,在本例中实际上是转换构造函数(C++14 的规则略有不同)。
  2. 由于我们定义了转换运算符,当您从 obj 生成 str 时,编译器不会报错。
  3. 当您执行 obj = 20 时,实际上是调用了转换构造函数。
  4. 使用 static_castobj 生成 str2,与生成字符串 str = obj 的方式非常相似;具有严格的类型检查。
  5. 当您写 obj = static_cast<Int> (30) 时,Static_cast 用于将 30 转换为整数

3. C++ 的 static_cast 在继承中的应用

在继承的情况下,static_cast 可以提供向上转型向下转型。下面的示例展示了 static_cast 在向上转型中的用法。

说明

上面的代码将完美编译。

  1. 我们将 d1 的地址显式转换为 Base 类型,并将其保存在 b1 中。
  2. 我们获取了 d1 的地址,使用 static_cast 将其转换为 Base 类型,然后将其存储在 b2 中。
  3. 在上面的示例中,base 类是公有继承的。