C++为什么非要引入那几种类型转换?

域名2025-11-05 06:11:491713

本文转载自微信公众号「程序喵大人」,什非作者程序喵大人 。引入转载本文请联系程序喵大人公众号。那种

大家好,类型我是转换程序喵,今天我们放松下,什非看一些类型转换的引入知识点!

众所周知C++关于类型转换引入了四种方式:

static_cast const_cast dynamic_cast reinterpret_cast

为什么要引入这几种类型转换,它与C语言中的那种强制类型转换有什么区别?

这四种类型转换分别应用在什么场景?

C++为什么要引入这几种强制类型转换?

我们都知道C++完全兼容C语言,C语言的类型转换方式很简单,可以在任意类型之间转换,转换但这也恰恰是什非缺点,因为极其不安全,引入可能不经意间将指向const对象的那种指针转换成非const对象的指针,可能将基类对象指针转成了派生类对象的类型指针,这种转换很容易出bug,转换需要严格审查代码才能消除这种隐患,b2b信息网但是C这种转换方式不利于我们审查代码,且程序运行时也可能会出bug。

而C++引入的这几种类型转换可以完美的解决上述问题,不同场景下不同需求使用不同的类型转换方式,同时有利于代码审查。

下面详细介绍这四种类型转换的使用场景:

static_cast 

使用方式:

#include <iostream> using namespace std; struct Base {     virtual void Func() { cout << "Base Func n"; } }; struct Derive : public Base {     void Func() override { cout << "Derive Func n"; } }; int main() {     float f = 1.23;     cout << "f " << f << endl;     int i = static_cast<int>(f);     cout << "i " << i << endl;     int *pi = static_cast<int *>(&f);  // error invalid static_cast from type ‘float*’ to type ‘int*’     Derive d;     d.Func();     Base *b = static_cast<Base *>(&d);      b->Func();     return 0; } 

使用场景:基本数据类型之间的转换使用,例如float转int,int转char等,在有类型指针和void*之间转换使用,子类对象指针转换成父类对象指针也可以使用static_cast。

非多态类型转换一般都使用static_cast,而且最好把所有的隐式类型转换都是用static_cast进行显示替换,不能使用static_cast在有类型指针之间进行类型转换。

dynamic_cast 

使用方式:

#include <iostream> using namespace std; struct Base {     virtual void Func() { cout << "Base Func n"; } }; struct Derive : public Base {     void Func() override { cout << "Derive Func n"; } }; int main() {     Derive d;     d.Func();     Base *b = dynamic_cast<Base *>(&d);     b->Func();     Derive *dd = dynamic_cast<Derive *>(b);     dd->Func();     return 0; } 

使用场景:用于将父类的指针或引用转换为子类的企商汇指针或引用,此场景下父类必须要有虚函数,因为dynamic_cast是运行时检查,检查需要运行时信息RTTI,而RTTI存储在虚函数表中,关于虚函数表具体可以看我的这篇文章:面试系列之C++的对象布局

const_cast 

使用方式:

int main() {     int data = 10;     const int *cpi = &data;     int *pi = const_cast<int *>(cpi);     const int *cpii = const_cast<const int *>(pi);     return 0; } 

使用场景:用于常量指针或引用与非常量指针或引用之间的转换,只有const_cast才可以对常量进行操作,一般都是用它来去除常量性,去除常量性是危险操作,还是要谨慎操作。

reinterpret_cast 

使用方式:

int main() {     int data = 10;     int *pi = &data;     float *fpi = reinterpret_cast<float *>(pi);     return 0; } 

使用场景:没啥场景,类似C语言中的强制类型转换,什么都可以转,万不得已不要使用,一般前三种转换方式不能解决问题了使用这种强制类型转换方式。高防服务器

本文地址:http://www.bzuk.cn/html/027f33899634.html
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

全站热门

51系统安装教程(详解51系统的安装步骤与技巧)

使用Python的urlliib.parse库解析URL

FastDFS并发会有bug,其实我也不太信?- 一次并发问题的排查经历

40个只有程序员才看得懂的段子

佳能50D配18-55镜头的完美搭配(出色成像,多功能应用,超值选择)

服务读写分离架构,绝不推荐

程序猿必须立即改正的 5 个坏习惯

React、Vue 、 Angular 共分天下,2018首将会是谁?

友情链接

滇ICP备2023006006号-33