一、static_cast
作用:
1.基本类型之间的转换
2.void指针转换为任意基本类型的指针
3.用于有继承关系的子类与父类之间的指针或引用的转换
基本类型之间的转换:
代码:
#include <iostream>
int main()
{
double i=1.1;
int a = static_cast<int>(i);
printf("%d\n",a);
double b = static_cast<int>(a);
printf("%lf\n",b);
}
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/af36f8678471b7edf78857e394245236.png)
分析:可以进行基本类型的转化,但是会损失精度类似与C语言的强制转化。跟reinterpret_cast不太一样reinterpret_cast是底层二进制的强制拷贝和语义转换不会损失精度。
void指针和其他指针的转换;
代码;
#include <iostream>
int main()
{
int *a = new int(1);
void *v = static_cast<void *>(a);
int *p = static_cast<int *>(v);
*a=2;
printf("%d\n",*a);
printf("%d\n",*p);
printf("%p\n",a);
printf("%p\n",p);
}
结果为:
![](https://i-blog.csdnimg.cn/blog_migrate/d91e4e38cbe3e248313df78dcbf4ce3b.png)
分析:这里是void指针和其他类型的指针进行的转化,结果是指向的是原地址。(普通类型的转换不是)
子类和父类之间的转换:
代码:
#include <iostream>
using namespace std;
class A
{
public:
A(){}
void foo()
{
cout<<"A!"<<endl;
}
};
class B:public A
{
public:
B(){}
void foo()
{
cout<<"B!"<<endl;
}
};
int main()
{
A *a = new A();
B * b = static_cast<B *>(a);
b->foo();
return 0;
}
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/c89da4ab4dcfdd89c7f621ce7cc979c1.png)
这是向下转型,是不安全的,但是为什么没有报错呢,因为B中还没有B特有的(B的成员变量)。我们在看看别的
代码:
#include <iostream>
using namespace std;
class A
{
public:
A(){}
void foo()
{
cout<<"A!"<<endl;
}
};
class B:public A
{
char b='c';
public:
B(){}
void foo()
{
cout<<b<<endl;
}
};
int main()
{
A * a = new A();
a->foo();
static_cast<B*>(a)->foo();
return 0;
}
运行结果;
![](https://i-blog.csdnimg.cn/blog_migrate/844822ca210263262f34c6ae08cc7476.png)
分析:这里就发生了错误了,B中特有的成员变量没有初始化(使用了不安全的向下转型)
static_cast的类的转型类似于普通的强转,可以抛出异常.