显式强制类型转换static_cast, dynamic_cast, const_cast, reinterpret_cast

 显式强制类型转换(cast)包括以下操作符:

static_cast,  dynamic_cast, const_cast, reinterpret_cast,对各种显式类型转换解释:

static_cast:编译器隐式执行的转换都可以有static_cast显式执行。

例子:

double num = 12.32; 

int data = num;

这个例子完成了显式类型转换,当然我们完全可以显式告诉编译器我要转换类型不且不关心转换后精度损失,就可以写成是:int data = static_cast<int>(num);

 

dynamic_cast:支持运行时识别指针或引用所指向的对象,如果绑定到引用或指针的对象不是目标类型的对象,则dynamic_cast失败,如果转换到指针类型的dynamic_cast失败,则dynamic_cast的结果为0值;如果转换到引用类型的dynamic_cast失败,则抛出一个bad_cast类型的异常。

因此,dynamic_cast操作符一次执行两个操作。首先验证被请求的转换是否有效,只有转换有效,操作符才实际进行转换。基类的指针可以赋值为指向派生类的对象,同样,基类的引用也可以用派生类对象初始化,因此,dynamic_cast操作符执行的验证必须在运行时进行。

 

const_cast:将转换掉表达式的const性质.

例子:

const char * source = "zhangsan";

char * dest = source;

编译出现错误提示:error C2440: 'initializing' : cannot convert from 'const char *' to 'char *'

这时我们可以运用const_cast去掉source的const性质。改为

char * dest = const_cast<char *>(source);就通过了编译。

 

或者:

1.

const int a = 9;

const_cast<int &>(a) = 0;

2.

const char p[4] = {'a', 'b', 'c'};

char *q = const_cast<char *>(p);

q[0] = 'c';

cout << p << endl;

cout << q << endl;

 

注:char p[4] = "abc";编译器处理时,将其直接存储在只读内存区域,所以不允许p[1]='b'; 这样的修改。

 

reinterpret_cast:顾名思义reinterpret:重新解释。就是将操作数内容解释为另一种不同的类型。这种强制转换本质上依赖于机器,而且非常危险。

 

例子:

int * source ;

char *dest = reinterpret_cast<char *>(source);

如上,本来source本来指向的对象时int类型,但是想把这块内存重新解释为char类型,就用reinterpret_cast,但是这很危险,编程人员必须记住dest指向的真实对象其实是int类型。

 

你的例子问题在于,既然你用const定义常量,就不能改变a的值,但是你赋值了,所以错误。const_cast只是去掉const属性,并没说你可以改变其内容,只是可以讲const定义的常量赋值给其他的变量而已。

你可能感兴趣的:(dynamic)