dynamic_cast的注意事项:
@1:dynamic_cast转换符只能用于指针或者引用。
@2:dynamic_cast转换符只能用于含有虚函数的类。
@3:dynamic_cast转换操作符在执行类型转换时首先将检查能否成功转换,如果能成功转换则转换之,如果转换失败,如果是指针则返回一个0值,如果是转换的是引用,则抛出一个bad_cast异常。所以在使用dynamic_cast转换之间应使用if语句对其转换成功与否进行测试(与上面不推荐对应的推荐用法),比如pd = dynamic_cast<D*>(pb); if(pd){…}else{…},或者这样测试if(dynamic_cast<D*>(pb)){…}else{…}。
<2>const_cast操作符:其表达式为const_cast<类型>(表达式),其中类型指要把表达式转换为的目标类型。该操作符用于改变const和volatile,const_cast最常用的用途就是删除const属性,如果某个变量在大多数时候是常量,而在某个时候又是需要修改的,这时就可以使用const_cast操作符了。const_cast操作符不能改变类型的其他方面,他只能改变const或volatile,即const_cast不能把int改变为double,也不可以把const int改变为int。const_cast只能用于指针或引用。const_cast的用法举例比如:int a=3; const int * b = & a; int * c = const_cast< int * >(b); * c = 4; cout<<a<<*c;这时输出两个4,如果不使用const_cast转换符则常量指针*c的值是不能改变的,在这里使用const_cast操作符,通过指针b就能改变常量指针和变量a的值。
举例代码:
//单独执行NOTE2、NOTE3和NOTE4都是正确的 , NOTE1为一种错误的例子!
#include <iostream>
using namespace std;
int main(){
/***********************NOTE 1**************************************
//const_cast 只能用于指针(或引用)的转换(主要针对 <类型> 中的类型而言的,即尖括号中的类型须为指针或引用类型)!
//不能把const int 转换为 int
//const_cast : cannot convert from 'const int' to 'int'
const int a = 10;
int b = const_cast<int>(a);
cout<<"a = "<<a<<"\t b = "<<b<<endl; //这段代码编译时会出错!
*/
/***********************NOTE 2**************************************
const int a = 2;
const int * aP = & a;
cout<<"before: a = "<<a<<endl; //2
int * p = const_cast<int *>(aP);
* p = 10 ;
cout<<"after: a = "<<a<<"\t * p = "<<* p<<endl; //2 10
cout<<"p = "<<p<<"\t a的地址为:"<<& a<<endl; //两者值是一样的
*/
/***********************NOTE 3**************************************
int a = 2;
const int * aP = & a;
cout<<"before: a = "<<a<<endl; //2
int * p = const_cast<int *>(aP);
* p = 10 ;
cout<<"after: a = "<<a<<"\t * p = "<<* p<<endl; //10 10
cout<<"p = "<<p<<"\t a的地址为:"<<& a<<endl; //两者值是一样的
*/
/***********************NOTE 4**************************************
//const_cast应用于 引用 的举例
const int & a = 10;
int & b = const_cast<int &>(a);
cout<<"a = "<<a<<"\t b = "<<b<<endl;
*/
return 0;
}
<3>static_cast操作符:该操作符用于非多态类型的转换,任何标准转换都可以使用他,即static_cast可以把int转换为double,但不能把两个不相关的类对象进行转换,比如类A不能转换为一个不相关的类B类型。static_cast本质上是传统c语言强制转换的替代品。
<4>reinterpret_cast操作符:该操作符用于将一种类型转换为另一种不同的类型,比如可以把一个整型转换为一个指针,或把一个指针转换为一个整型,因此使用该操作符的危险性较高,一般不应使用该操作符。
举例:
#include <stdio.h>
class A{//C语言是没有类的,这里为了共同使用类和prinf(),使用了这种不规范的写法!
public:
int m_a;
};
class B{
public:
int m_b;
};
class C : public A, public B{
};
void main(){
C c;
printf("%p, %p, %p\r\n", &c, reinterpret_cast<B*>(&c), static_cast <B*>(&c));
}