今天是周三,2点来到图书馆,同学们打电话让去打篮球,可是我不能去,因为还有好多知识没有学习到,图书馆环境不错很适合学习,写一篇博客吧:)
C++中的四种强制类型转换,面试中有面试官问到我这个问题,闲话不多说了。
1.dynamic_cast运算符
功能:该转换符用于将一个指向派生类的基类指针或引用转换为派生类的指针或引用。
注意:
dynamic_cast只能用于含有虚函数的类,其表达式为dynamic_cast<类型>表达式,其中的类型是表达式要转换成的目标类型。
例子: B是基类,D是派生类
B* pb;
D* pd,md;
pb = &md;
pd = dynamic_cast<D*>pb;
有些时候我们需要强制类型转换,比如指向派生类的基类指针pb,想要访问D中除虚函数之外的成员时,就需要把该指针转换为指向派生类的D的指针,以达到访问派生类中特有的成员的目的。比如派生类中含有特有的成员函数的get()时,就可以这样访问dynamic_cast<D*>pb->get();
因为dynamic_cast转换后的结果是一个指向派生类的指针,所以可以访问派生类中的特有的成员。特别提醒:该语句不会影响原来的指针的类型,即基类指针仍然是指向基类B的。
注意:
dynamiac_cast转换符只能用于指针或引用,只能用于含有虚函数的类,在转换时首先检查能否成功转换,否则失效。
2.const_cast操作符
表达式:const_cast<类型>表达式
类型指的是要把表达式转换为的目的类型。
该操作符用于改变const和volatile,最常用的用途就是删除const属性,如果某个变量在大多数时候是常量,而在某个时刻又是需要修改的,这时候就可以用const_cast。
const_cast不能把int转换为double,但可以把const int 转换为int, 和第一个一样只能用于指针和引用
例子:
int a = 3;
const int *b = &a;
int *c = const_cast<int *>(b);
*c = 4;
cout<<*c<<endl<<a<<endl;
这时候输出两个4,如果不使用const_cast的话,常量指针的值是不能改变的。
3.static_cast操作符
该操作符用于非动态类型转换,任何标准的转换都可以使用它,即static_cast可以把int转换为double,但不能把两个不相关的类对象进行转换,本质上是c语言强制类型转换的替代品。
例子:
int i ;
float f = 12.3f;
i = static_cast<int>(f);
cout<<i<<endl;
此时i的值为12.
4.reinterpret_cast
表达式:reinterpret_cast<类型>(表达式)
该操作符用于将一种类型转换为另一种不同的类型,使用此操作符的危险性较高,一般不使用。
也就是说将数据以二进制存在的形式重新解释。