用法: static_cast
说明:该运算符把expression转换为type_name类型,static_cast在编译时使用类型信息执行转换,在转换执行必要的检测(如指针越界计算,类型检查等),但没有运行时类型检查来保证转换的安全性。
使用范围:
enum WeekType {sun=0,mon=1,thus=2,wed=3,thurs=4,fir=5,sat=6};
int main()
{
int main()
{
int a = 10;
cout << a << endl;
char ch = 'x';
cout << ch << endl;
double dx = 12.23;
cout << dx << endl;
a = static_cast<int>(ch);
cout << a << endl;
a = static_cast<int>(dx);
cout << a << endl;
WeekType x = mon;
a = x;
cout << a << endl;
x = static_cast<WeekType>(a);
cout << x << endl;
}
这个代码中,转换的都有:将ch转换为int类型,dx转换为int类型,a转换为枚举类型,这些都是基本类型间的转换。
输出结果为:

注意,其中的x转换成int类型后,打印的是其ASII值
int main()
{
int a = 10;
int* p = &a;
int* s = static_cast<int*>(&a);
//指针转换的限制
const int* cp = &a;
s = static_cast<int*>(cp);//error
char* dp = static_cast<char*>(p);//error
}
注意:
s = static_cast
char* dp = static_cast
int main()
{
int a = 10;
int* ip = nullptr;
double* dp = nullptr;
void* vp = &a;
ip = static_cast<int*>(vp);
dp = static_cast<double*>(vp);
return 0;
}
注意:

int main()
{
int a = 10;
int b = 20;
static_cast<void>(a + b);
return 0;
}

int main()
{
int a = 10;
int &x = a;
int&& rx = a;//error
int&& rx = static_cast<int&&>(a);
return 0;
}
代码中&& rx = a错误是因为,一个&加变量rx是引用,两个&加变量rx就变成了右值,右值就是不能取地址的值(不能修改的值),如果一意将一个左值a给rx,这是不行的。
但是可以用static_cast将左值转换成右值,即int&& rx = static_cast
class Object
{
private:
int value;
public:
Object(int x=0):value(x) { }
void func() { }
};
class Base :public Object
{
private:
int num;
public:
Base(int x = 0) :Object(x + 10), num(x) { }
void show() const { }
};
int main()
{
Object* op = nullptr;
Base* bp = nullptr;
Base base;
Object obj;
op = &obj;
bp = &base;
op = static_cast<Object*>(&base);
bp = static_cast<Base*>(&obj);//不安全
return 0;
}
代码中出现了上行转换和下行转换,即上行转换为把派生类的指针或引用转换为基类表示,下行转换为把基类的指针或引用转换为派生类表示,注意上行转换是安全的,下行转换没有动态类型检查,是不安全的。

注意:
隐式执行任何类型的转换都可由static_cast显示完成,但是static_cast不能转换掉表达式含有const,volatile或者_unaligned属性。