- static_cast
- 1 用于基本类型间的转换,如把int转换成char,把int转换成enum
- 2 指针转换的限制
- 3 可以将void*转换为其他类型
- 4 弃值表达式
- 5 左值转到右值
- 6 用于类层次结构中基类和派生类之间指针或引用的转换
用法: 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(ch);
cout << a << endl;
a = static_cast(dx);
cout << a << endl;
WeekType x = mon;
a = x;
cout << a << endl;
x = static_cast(a);
cout << x << endl;
}
这个代码中,转换的都有:将ch转换为int类型,dx转换为int类型,a转换为枚举类型,这些都是基本类型间的转换。
输出结果为:
注意,其中的x转换成int类型后,打印的是其ASII值
int main()
{
int a = 10;
int* p = &a;
int* s = static_cast(&a);
//指针转换的限制
const int* cp = &a;
s = static_cast(cp);//error
char* dp = static_cast(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(vp);
dp = static_cast(vp);
return 0;
}
注意:
int main()
{
int a = 10;
int b = 20;
static_cast(a + b);
return 0;
}
5 左值转到右值
int main()
{
int a = 10;
int &x = a;
int&& rx = a;//error
int&& rx = static_cast(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
代码中出现了上行转换和下行转换,即上行转换为把派生类的指针或引用转换为基类表示,下行转换为把基类的指针或引用转换为派生类表示,注意上行转换是安全的,下行转换没有动态类型检查,是不安全的。
注意:
隐式执行任何类型的转换都可由static_cast显示完成,但是static_cast不能转换掉表达式含有const,volatile或者_unaligned属性。



