理解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 运算符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值