C++11四种强制类型转换

211 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情

1.const_cast

作用:去const化。

下面我们来看这个代码

        很容易就能够看出来错误是出现在哪里的,const是用来声明常量字段的,其定义的变量是不能够修改的。

        那么如何去修改这个变量呢?这个时候就可以使用const_cast了。const_cast可以去const化,以达到更改常量值的目的。

image.png

我们使用引用,去用str1去引用str的值,改变str1即为改变str的值。

运行查看输出结果,我们得到了更改后的str的值。由此得知,const_cast可以去引用化。

但是需要注意的是,当我们使用int类型的时候,输出的却是1。这是因为编译器做了优化,声明了const的变量,我们就将其保存在符号表中,输出的是符号表中的内容。另外还需要注意const_cast中传递的需是引用或者指针类型。

 

2.static_cast

        static_cast用于将一种数据类型转换成另一种数据类型。比如:

但是,它不能用于指针之间的类型转换。

但是,我们可以使用中间变量进行转换,可以先转换为万能指针void*,然后再从万能指针转换为想要的类型的指针。

 

3.reinterpret_cast

reinterpret_cast的功能十分强大,可以强制转换任意类型。我们只需记住他可以指针类型之间的转换即可。

4.dynamic_cast

将基类的指针或引用安全地转换成派生类的指针或引用,并用派生类的指针或引用调用非虚函数。如果是基类指针或引用调用的是虚函数无需转换就能在运行时调用派生类的虚函数。       

使用dynamic_cast需要注意的是:

(1)其他三种都是编译时完成的,dynamic_cast是运行时处理的,运行时要进行类型检查。

(2)不能用于内置的基本数据类型的强制转换。

(3)dynamic_cast转换如果成功的话返回的是指向类的指针或引用,转换失败的话则会返回

NULL。

(4)使用dynamic_cast进行转换的,基类中一定要有虚函数,否则编译不通过。

需要检测虚函数的原因:类中存在虚函数,就说明它想要有让基类指针或引用指向派生类对象的情况,此时转换才有意义。

向上转换:即为子类指针指向父类指针(一般不会出问题);向下转换,即将父类指针转换为子类指针。