当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


C++ static_cast用法及代码示例


Cast 运算符是一元运算符,它强制将一种数据类型转换为另一种数据类型。

C++ 支持 4 种类型的转换:

  1. 静态投射
  2. Dynamic _Cast
  3. 常量演员表
  4. 重新诠释演员阵容

本文重点详细讨论static_cast。

静态投射

这是可以使用的最简单的转换类型。这是一个编译时转换。它执行类型之间的隐式转换(例如 int 到 float,或指向 void* 的指针)之类的操作,并且还可以调用显式转换函数。

static_cast 的语法

static_cast <dest_type> (source);

static_cast的返回值为dest_type。

static_cast 的示例

下面是实现static_cast的C++程序:

C++


// C++ Program to demonstrate
// static_cast
#include <iostream>
using namespace std;
// Driver code
int main()
{
    float f = 3.5;
    // Implicit type case
    // float to int
    int a = f;
    cout << "The Value of a: " << a;
    // using static_cast for float to int
    int b = static_cast<int>(f);
    cout << "\nThe Value of b: " << b;
}
输出
The Value of a: 3
The Value of b: 3

static_cast在不同场景下的行为

1. static_cast 用于基本数据类型指针:

现在让我们对上面的代码进行一些更改。

C++


// C++ Program to demonstrate 
// static_cast char* to int*
#include <iostream>
using namespace std;
// Driver code
int main()
{
  int a = 10;
  char c = 'a';
   
  // Pass at compile time, 
  // may fail at run time
  int* q = (int*)&c;
  int* p = static_cast<int*>(&c);
  return 0;
}

输出

error: invalid 'static_cast' from type 'int*' to type 'char*'

说明:这意味着即使您认为可以以某种方式将特定对象指针类型转换为另一个对象指针,但这是非法的,static_cast 也不允许您这样做。

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

static_cast 能够调用该类的conversion operator(如果已定义)。让我们再举一个将对象与类相互转换的例子。

例子:

C++


// C++ Program to cast
// class object to string
// object
#include <iostream>
#include <string>
using namespace std;
// new class
class integer {
    int x;
public:
    // constructor
    integer(int x_in = 0)
        : x{ x_in }
    {
        cout << "Constructor Called" << endl;
    }
    // user defined conversion operator to string type
    operator string()
    {
        cout << "Conversion Operator Called" << endl;
        return to_string(x);
    }
};
// Driver code
int main()
{
    integer obj(3);
    string str = obj;
    obj = 20;
    // using static_cast for typecasting
    string str2 = static_cast<string>(obj);
    obj = static_cast<integer>(30);
    return 0;
}
输出
Constructor Called
Conversion Operator Called
Constructor Called
Conversion Operator Called
Constructor Called

解释:让我们尝试逐行理解上面的输出:

  1. 什么时候对象创建后,调用构造函数,在我们的例子中,它也是一个转换构造函数(对于 C++14 规则进行了一些更改)。
  2. 当你创建时str在......之外对象,编译器不会抛出错误,因为我们已经定义了转换运算符。
  3. 当你做对象=20,您实际上正在调用转换构造函数。
  4. 当你做str2在......之外static_cast,它与字符串非常相似字符串 = 对象;但有严格的类型检查。
  5. 当你写的时候obj = static_cast <整数> (30),您将 30 转换为整数使用static_cast。

3.static_cast用于C++中的继承

static_cast在继承的情况下可以提供向上转型和向下转型。以下示例演示了在向上转换的情况下使用static_cast。

例子:

C++


// C++ Program to demonstrate 
// static_cast in inheritance
#include <iostream>
using namespace std;
class Base 
{};
class Derived : public Base 
{};
// Driver code
int main()
{
  Derived d1;
   
  // Implicit cast allowed
  Base* b1 = (Base*)(&d1);
   
  // upcasting using static_cast
  Base* b2 = static_cast<Base*>(&d1);
  return 0;
}

说明:上面的代码将编译,没有任何错误。

  1. 我们获取 d1 的地址并将其显式转换为 Base 并将其存储在 b1 中。
  2. 我们获取 d1 的地址并使用 static_cast 将其转换为 Base 并将其存储在 b2 中。

在上面的例子中,我们继承了public基类。当我们将其继承为私有时会发生什么?下面的示例演示了以下内容:

例子:

C++


// C++ program to demonstrate 
// static_cast in case of 
// private inheritance
#include <iostream>
using namespace std;
class Base 
{};
class Derived: private Base 
{ 
  // Inherited private/protected 
  // not public
};
// Driver code
int main()
{    
  Derived d1;
   
  // Implicit type cast allowed
  Base* b1 = (Base*)(&d1);
   
  // static_cast not allowed
  Base* b2 = static_cast<Base*>(&d1);
  return 0;
}

编译时错误:

[Error] 'Base' is an inaccessible base of 'Derived'

说明:即使您将其继承为受保护的,上面的代码也不会编译。

So to use static_cast in case of inheritance, the base class must be accessible, non virtual and unambiguous.

4. static_cast 投射“往返”空指针

static_cast 运算符允许从任何指针类型转换为 void 指针,反之亦然。

例子:

C++


// C++ program to demonstrate 
// static_cast to cast 'to and 
// from' the void pointer
#include <iostream>
using namespace std;
// Driver code
int main()
{
  int i = 10;
  void* v = static_cast<void*>(&i);
  int* ip = static_cast<int*>(v);
  cout << *ip;
  return 0;
}
输出
10


相关用法


注:本文由纯净天空筛选整理自amanrk92大神的英文原创作品 static_cast in C++。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。