C++两种强制类型转换

1 继承自C语言的强制类型转换

C语言强制类型转换

(类型)待转换值


2 C++新增的标准转换

C++新增的标准转换方法:

(1)static_cast<类型>(待转换值)
(2)dynamic_cast <类型>(待转换值)
(3)const_cast <类型>(待转换值)
(4)reinterpret_cast <类型>(待转换值)


3 两种转换结果大不相同

(1)C语言风格的强制类型转换,不智能,不会转变地址值。

说明:以下举例仅仅是举例,在实际代码中不应该有这种危险写法。

#include <iostream>
using namespace std;
int main()
{
     A *pa = new A();
     pa->f();
     B* pb = (B*)pa;     // C语言风格的强制转换
     cout << "pa = " << pa << endl;
     cout << "pb = " << pb << endl;
     pb->f();
     return 0;
}

结果如下:

图1 C语言风格的强制类型转换

可以看到,转换前后的地址值压根没变,所以调的还是a的方法。此时如果使用指针pb调一个B类有的而A类没有的方法,会崩溃。

图2 C语言风格强制把父类指针转成子类指针,调子类特有的函数会崩溃

(2)C++语言风格的强制类型转换,很智能,但是会出别的问题。

相同的例子,只是把C风格的强制转换替换成C++风格,如下:

#include <iostream>
using namespace std;
int main()
{     
    A *pa = new A();
    pa->f();
    B* pb = dynamic_cast<B*>(pa);     // C++语言风格的强制转换
    cout << "pa = " << pa << endl;
    cout << "pb = " << pb << endl;
    pb->f();
    return 0;
}

结果,pb->f()直接发生崩溃,如下:

图2 pa强制转换成pb后,pb是nullptr

因为dynamic_cast是个动态转换。它认为:父类对象的指针转成子类指针,就是nullptr

Note1:

dynamic_cast用于父子类型之间的转换时,要求父类型至少有一个virtual函数。否则,编译报错。

Note2:

类对象是nullptr的时候,也可以调类对象的函数,但是有两点要求:
(1)所调的函数不是虚函数
(2)函数里面没有使用到成员变量
即,不能使用this指针,也不能使用动态绑定。

Tips:

如果想要和C一样的效果,在C++里面要用static_cast。上面的例子中,把dynamic_cast换成static_cast就和C语言转换的效果一样了。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容