static_cast Operator详解

句式

static_cast <type-id> ( expression )

static_cast是一个强制类型转换操作符。

static_cast转化可以用于将基类的指针转化为派生类指针。但是这种转化并不总是安全。

static_cast转换可以用于numeric data types 的转化,例如将枚举转化为int或者浮点型,需要你确定参与的数据可以转化。

由于static_cast不会做编译类型检查所以它不如dyamic_cast安全。dyamic_cast转化到一个模糊类型的指针时会失败,而static_cast则不会返回任何错误。尽管dyamic_cast看起来安全,但是只在引用和指针上使用,而且运行类型检查也是一项开销。

例子

// 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);   // Not safe, D can have fields
                                   // and methods that are not in B.

   B* pb2 = static_cast<B*>(pd);   // Safe conversion, D always
                                   // contains all of B.
}

 与dynamic_cast相比,对pb的static_cast转换不进行任何运行时检查。pb指向的对象可能不是D类型的对象,在这种情况下,* pd2的使用可能是灾难性的。例如,调用属于D类而不是B类的成员的函数可能会导致访问冲突。

int main()
{
//基类指针转为派生类指针,且该基类指针指向基类对象。
ANIMAL * ani1 = new ANIMAL ;
DOG * dog1 = static_cast<DOG*>(ani1);
//dog1->OutPuttype();//错误,在ANIMAL类型指针不能调用方法OutPutType();在运行时出现错误。//基类指针转为派生类指针,且该基类指针指向派生类对象

ANIMAL * ani3 = new DOG;
DOG* dog3 = static_cast<DOG*>(ani3);
dog3->OutPutname(); //正确

//子类指针转为派生类指针
DOG *dog2= new DOG;
ANIMAL *ani2 = static_cast<DOG*>(dog2);
ani2->OutPutname(); //正确,结果输出为大黄

//
system("pause");
}

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

// 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运算符还可用于执行任何隐式转换,包括标准转换和用户定义的转换。例如:

// 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运算符将任何表达式显式转换为void类型。目标void类型可以选择包含const,volatile或__unaligned属性。

由于在重定位垃圾回收器上执行未经检查的强制转换很危险,只有确定这种转化方式没有问题,才可以在要求性能的情况下使用static_cast。如果必须在release版本下下使用static_cast,请在debug版本中将它替换为safe_cast以确保成功。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值