当前位置: 首页 > article >正文

理解C++编译时类型转换符:static_cast

目录

1.  static_cast 语法格式

2.  static_cast 用法示例


1.  static_cast 语法格式

static_cast < type-id > ( expression )

在标准 C++ 中,不存在有助于确保转换安全性的运行时检查措施。在C++ 中,通常执行编译时和运行时检查

    static_cast 运算符常用于将一个指向基类的指向转换为一个指向派生类的指针。这样的转换总是不安全的

    通常,当你想要将数字数据类型(例如枚举转换为整数或将整数转换为浮点数)并且你确定转换中涉及的数据类型时,可以使用 static_caststatic_cast 转换不如 dynamic_cast 转换安全因为 static_cast 不进行运行时类型检查 dynamic_cast 进行运行时类型检查对不明确指针的 dynamic_cast 将失败 static_cast 返回时好像没有错误一样这可能很危险尽管 dynamic_cast 转换更安全 dynamic_cast 仅适用于指针或引用并且运行时类型检查是一种开销

2.  static_cast 用法示例

在下面的转换中,语句 D* pd2 = static_cast<D*>(pb); 不是安全的,因为 D 有不在B 中的域和方法。然而,语句 B* pb2 = static_cast<B*>(pd); 是安全转换,因为D总是包含整个B

例1:

C++:

// static_cast_Operator.cpp

// compile with: /LD

class B {};

class D : public B {};

void f(B* pb, D* pd) {

   D* pd2 = static_cast<D*>(pb);// 不安全, D 有不在B中的域和方法

   B* pb2 = static_cast<B*>(pd);   // 安全, D 总是包含事个B                        

}

dynamic_cast 不同,pb 的 static_cast 转换不进行运行时检查。pb 指向的对象可能不是 D 类型的对象,在这种情况下使用 *pd2 可能会带来灾难性的后果。例如,调用属于 D 类但不是 B 类的函数可能会导致访问冲突。

         dynamic_cast static_cast 运算符在类层级结构中移动指针。但是static_cast 完全依赖于转换语句中提供的信息,因此可能不安全。例如:

C++:

// static_cast_Operator_2.cpp

// compile with: /LD /GR

class B {

public:

   virtual void Test(){}

};

class D : public B {};

void f(B* pb) {

   D* pd1 = dynamic_cast<D*>(pb);

   D* pd2 = static_cast<D*>(pb);

}                

如果 pb 确实指向 D 类型的对象,则 pd1 和 pd2 将获得相同的值。如果 pb == 0,它们也将获得相同的值。

如果 pb 指向 B 类型的对象而不是完整的 D 类 dynamic_cast 会知道返回零。但是,static_cast 依赖于程序员的断言,即 pb 指向 D 类型的对象,并仅返回指向该假定 D 对象的指针。

因此,static_cast 可以执行隐式转换的逆操作,在这种情况下结果是未定义的。程序员需要验证 static_cast 转换的结果是否安全。

此行为也适用于类类型以外的类型。例如,static_cast 可用于将 int 转换为 char。但是,生成的 char 可能没有足够的位来保存整个 int 值。同样,需要由程序员来验证 static_cast 转换的结果是否安全。

static_cast 运算符还可用于执行任何隐式转换,包括标准转换和用户定义转换。例如:

C++:

// static_cast_Operator_3.cpp

// compile with: /LD /GR

typedef unsigned char BYTE;

void f() {

   char ch;

   int i = 65;

   float f = 2.5;

   double dbl;

   ch = static_cast<char>(i);   // int to char

   dbl = static_cast<double>(f);   // float to double

   i = static_cast<BYTE>(ch);

}

static_cast 运算符可以显式地将整数值转换为枚举类型。 如果整数类型的值不在枚举值范围内,则得到的枚举值是未定义的。

static_cast 运算符将空指针值转换为目标类型的空指针值

static_cast 运算符无法抛弃 constvolatile__unaligned 属性。有关移除这些属性的信息,请参阅 const_cast 运算符。


http://www.kler.cn/a/518471.html

相关文章:

  • 系统思考—复杂问题的根源分析
  • 技术之翼,创作之心
  • Java设计模式 十 装饰模式 (Decorator Pattern)
  • 2025,“鱿鱼游戏”闯入AI赛道
  • MySql精确匹配“,“分隔开的内容的函数语法
  • 探索Python GUI新选择:Flet库介绍与快速实践
  • Leetcode热题——移动零
  • [STM32 - 野火] - - - 固件库学习笔记 - - -十一.电源管理系统
  • ELK环境搭建
  • 在K8S中,如果后端NFS存储的IP发送变化如何解决?
  • 一个vue项目npm install失败的问题解决方案
  • 后端学习路线
  • Linux系统 C/C++编程基础——基于Qt的图形用户界面编程
  • +-*/运算符优先级计算模板
  • 数学大模型MAmmoTH:通过混合说明调整建立数学通才模型
  • 浏览器默认语言与页面访问统计问题二三则
  • 网络知识小科普--5
  • 题海拾贝:力扣 622.设计循环队列
  • 后端面试题分享第一弹(状态码、进程线程、TCPUDP)
  • Midscene.js:重新定义UI自动化的新时代工具