static_cast是一个强制类型转换操作符。强制类型转换,也称为显式转换,C++中强制类型转换操作符有四个
- static_cast
- dynamic_cast
- const_cast
- reinterpert_cast。
介绍static_cast操作符
- 用于类层次结构中,基类和子类之间指针和引用的转换;
当进行上行转换,也就是把子类的指针或引用转换成父类表示,这种转换是安全的;
当进行下行转换,也就是把父类的指针或引用转换成子类表示,这种转换是不安全的,也需要程序员来保证;
#include <iostream>
using namespace std;
class Base{
int a;
public:
void baseMethod(){
cout << "Base method" << endl;
};
};
class ChildClass: public Base{
int b;
public:
void childMethod(){
cout << "child method" << endl;
};
};
int main(){
/* 上行转换 */
ChildClass child;
Base b = static_cast<Base>(child);
b.baseMethod();
/* 下行转换 */
Base bb;
ChildClass cc = static_cast<ChildClass>(bb);
}
- 编译器隐式执行的任何类型转换都可以由static_cast来完成,比如int与float、double与char、enum与int之间的转换等。
double a = 1.999;
int b = static_cast<double>(a); //相当于a = b
当编译器隐式执行类型转换时,大多数的编译器都会给出一个警告:
e:\vs 2010 projects\static_cast\static_cast\static_cast.cpp(11): warning C4244: “初始化”: 从“double”转换到“int”,可能丢失数据
把精度大的类型转换为精度小的类型,static_cast使用位截断进行处理。
-
把void指针转换成目标类型的指针,是及其不安全的;static_cast不能转换掉expression的const、volatile和__unaligned属性。
使用static_cast可以找回存放在void*指针中的值。
double a = 1.999;
void * vptr = & a;
double * dptr = static_cast<double*>(vptr);
cout<<*dptr<<endl;//输出1.999