句式
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以确保成功。