`

显式强制类型转换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定义的常量赋值给其他的变量而已。

分享到:
评论

相关推荐

    标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast

    ### 标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast 在C++编程语言中,为了提高程序的可读性和安全性,C++标准库提供了多种类型的转换机制。其中,最常用的四种类型转换符包括:`...

    例说 const_cast,reinterpret_cast,static_cast,dynamic_cast代码.rar

    本资源“例说 const_cast,reinterpret_cast,static_cast,dynamic_cast代码.rar”聚焦于四种主要的C++类型转换:const_cast、reinterpret_cast、static_cast和dynamic_cast。这四个关键字都是为了安全和高效地在...

    C++中的类型转换static_cast、dynamic_cast、const_cast和reinterpret_cast总结

    本文将详细介绍四种主要的显式类型转换:`static_cast`、`dynamic_cast`、`const_cast`和`reinterpret_cast`。 首先,`static_cast`主要用于非多态类型的转换,它不提供运行时的类型检查。例如,当进行基类与子类...

    static_cast、dynamic_cast、reinterpret_cast和const_cast

    标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast

    C++中4种强制类型转换的区别总结

    使用标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast。 const_cast,字面上理解就是去const属性。 static_cast,命名上理解是静态类型转换。如int转换成char。 dynamic_cast,...

    浅谈C++中强制类型转换函数

    C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用,即const_cast、static_cast、dynamic_cast和reinterpret_cast。 const_cast是用于去掉类型的const或volatile属性的操作符。它常用于指针或引用,...

    static_cast,dynamic_cast,reinterpret_cast,const_cast的区别及用法详解

    2.dynamic_cast提供安全的转换如果两个指针不存在继承关系转换会失败返回空指针,如果你提供一个错误的指针那样会发生内存访问异常,因为它会去比较两个类型的虚函数表。虚函数表的指针一般放在对象指针最开始的四字...

    C++中的类型转换

    本文将详细介绍C++中的四种显式类型转换:static_cast、dynamic_cast、const_cast和reinterpret_cast。 1. static_cast static_cast是一种静态类型转换,用于非多态类型之间的转换,不提供运行时的检查来确保转换...

    static_cast,dynamic_cast,reinterpret_cast和const_cast的区别详解

    这就是典型的c-style类型转换。下面是一个简单的程序: 代码如下:#include &lt;iostream&gt;using namespace std;int main(void){ int i; double d = 11.29; i = (int)d; cout &lt;&lt; i &lt;&lt; endl; co

    C++显式类型转换[借鉴].pdf

    C++ 提供了四个显式的数据类型转换函数:reinterpret_cast、const_cast、static_cast 和 dynamic_cast。这些转换函数可以在编译期间或运行期间实现数据类型的转换。 1.reinterpret_cast reinterpret_cast 是一种低...

    类型转换操作符:static_cast,dynamic_cast,const_cast,reinterpret_cast.

    在C语言中类型转换有几种方式:1.(expression).在表达式外边加括号,由编译器来决定怎么改变。2.new_type(expression).强制类型括号住表达式。3.(new_type)expression.括号住强制类型。4.C语言允许的内置转换。这些...

    C++的cast强制类型转换

    C++提供了多种类型转换方式,包括`static_cast`、`dynamic_cast`、`const_cast`以及`reinterpret_cast`。本文将重点探讨`dynamic_cast`的使用方法、注意事项及其与其他类型转换符的对比,旨在为读者提供全面而深入的...

    C++4种强制类型转换

    C++提供了四种标准的强制类型转换运算符,分别是`static_cast`、`dynamic_cast`、`reinterpret_cast`和`const_cast`。这些运算符在不同的情景下有不同的用途和限制,下面我们逐一详细探讨。 1. `static_cast` `...

    C++ 四种强制类型转换的总结

    在C++编程语言中,为了实现不同数据类型之间的转换,提供了四种不同的强制类型转换操作符:`static_cast`、`const_cast`、`dynamic_cast` 和 `reinterpret_cast`。这些操作符不仅在日常开发中十分常见,而且在处理...

    C++ 中的强制类型转换

    C++提供了四种显示的强制类型转换操作符,分别是`const_cast`、`static_cast`、`dynamic_cast`和`reinterpret_cast`。 1. `const_cast`: `const_cast`主要用于移除对象的`const`或`volatile`属性,允许程序员修改...

    C++中用于强制类型转换的四个运算符

    本文详细介绍了C++中的四个用与强制类型转换的运算符:用来修改类型的const 或volatile 属性的const_cast,用来修改操作数类型的reinterpret_cast,static_cast,dynamic_cast

    四种强制类型转换分析文档1

    本文将详细解析四种强制类型转换:const_cast、static_cast、dynamic_cast以及reinterpret_cast。 首先,`const_cast`主要用于改变对象的const或volatile属性。它的原型是`const_cast(expression)`。它允许你去除...

Global site tag (gtag.js) - Google Analytics