C++与类型转换相关的四个关键字及其特点

来源:互联网 发布:中国新歌声网络直播权 编辑:程序博客网 时间:2024/03/29 04:45

首先,C++与类型转换相关的四个关键字有:const_cast, static_cast, dynamic_cast, reinterpret_cast.

什么是类型转换?

表达式是否合法取决于操作数的类型,而且合法的表达式其含义也由操作数类型决定。但是在C++中,某些类型之间存在相关的依赖关系。若两种类型相关,则可在需要某种类型的操作数位置上,使用该类型的相关类型对象或值。如果两个类型之间可以相互转换,则称这两个类型相关

那么,第一个关键字登场了,static_cast关键字就是提供这种场合下的类型转换。C++默认的整数类型之间的转换就属于这种。

与之相反,如果被转换的两种类型之间不相关,比如int指针转换为char指针,就要使用reinterpret_cast这个关键字。

接下来登场的是const_cast。 使用const_cast会消除被转换类型的const特性,而且只有const类型的变量才能使用。那么,什么情况下需要消除一个const变量的const特性呢?比如,有时候有的函数的形参类型为非const类型,那么如果你要将一个const类型的参数传入就会报错。所以在这种情况下需要先使用const_cast转化一下。

最后,就剩下dynamic_cast了。它是一种作运行时(run-time)检测的类型转换。它可以将基类类型的指针或引用安全地转换为派生类型的指针或引用。当具有基类的引用或指针,但需要执行不是基类组成部分的派生类操作的时候,需要动态的强制类型转换。通常,从基类指针获得派生类行为最好的方法是通过虚函数。当使用虚函数的时候,编译器自动根据对象的实际类型选择正确的函数。但是,在某些情况下,不可能使用虚函数。这时候就需要使用dynamic_cast关键字了。但是,能用虚函数还是用虚函数最好。

与其他强制类型转换不同,dynamic_cast涉及运行时类型检查。如果绑定到引用或指针的对象不是目标类型的对象,则dynamic_cast失败。

补充:

在上面四个类型转化关键字中,除了static_cast,其他的三个都有可能涉及到指针的类型转换。从本质上来说,指针的类型不同,并没有产生很大的差异,他们都是需要足够的内存来存放一个机器地址。“指向不同类型之各指针”间的差异,既不在其指针表示法不同,也不在其内容(代表一个地址)不同,而是在其所寻址出来的object不同。也就是说,“指针类型”会教导编译器如何解释某个特定地址中的内存内容及其大小。

所以,转换(cast)其实是一种编译器指令。大部分情况下它并不改变一个指针所含的真正地址,它只影响“被指出之内存大小和其内容”的解释方式。

0 0