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

告别机载网络通信混乱:利用ARINC825的LCC与带宽管理机制构建高可靠CAN总线 本文深入探讨了ARINC825规范如何通过逻辑通信通道(LCC)和带宽管理机制解决机载CAN总线通信的混乱问题。文章详细解析了ARINC825的核心架构设计、LCC工程实现、时间触发带宽管理等关键技术,展示了其在提升航空电子系统可靠性和实时性方面的显著效果,为现代飞机通信系统提供了高可靠解决方案。 阅读详情

呵呵,今天来好好看看着几个转换操作符的用法。以前老是看着眼熟,但是用着手生。今天决定搞定这些个东西。

在C语言中类型转换有几种方式:

1.      (expression). 在表达式外边加括号,由编译器来决定怎么改变。

2.      new_type(expression). 强制类型括号住表达式。

3.      (new_type)expression. 括号住强制类型。

4.      C语言允许的内置转换。

这些转换非常高效,我非常喜欢使用。特别是在指针转换和数值转换时用到的非常多。只要编写程序的人知道自己要做什么转换,并知道应该怎样转换的话,我认为上边的转换方式非常之好。但是没有清楚的了解每个转换的细节的话,就有可能出现问题,比如指针指向不应该指向的区域:出现野指针或者指向位置错误(主要是对内存结构不了解),或者计算数值被截去等问题发生。

C++程序兼容C语言的转化,但是针对面向对象语言的特性,设计了以下几个类型转换操作符。他们的出现是为了C语言类型转换中语义模糊和固有的危险陷阱,因为C语言不去判断所要操作的类型转换是否合理。

static_cast:用于非多态类型的转换。

dynamic_cast:用于多态类型的转换。

const_cast:用来消除const, volatile, __unaligned属性的转换。

reinterpret_cast:用于空间的重新解释。

还有一个在VS2005中出现的类型转换关键字safe_cast.#2

 

static_cast:

static_cast<type_id>(expression)

这个关键字可以用来将一个指针转换为父类的指针也可以转换为子类的指针或者基本的类型转换。但是这种转换是强制的,并没有任何运行时类型检查来保证转换的正确性,所以编写代码的人需要明白自己所进行的转换是否合理。

//基本类型的转换

enum e { A = 1, B, C };

double d = 12.25;

unsigned int ui = 25;

char c = static_cast<char>(ui);

int i = static_cast<int>(d);

int j = static_cast<int>(B);

//父类子类转换

class F                  //father

{

public:

    int _father;

};

class S : public F       //son

{

public:

    _son;

};

F *pFather = new F();

S *pSon = new S();

F *pF;

S *pS;

pF = static_cast<F *>(pSon);    //将子类指针转换为父类指针,OK

pS = static_cast<S *>(pFather); //将父类指针转换为子类指针,错误

第二个错误的转换不是说编译器编译不过去,而是运行时会出现错误。

原因如下:假设pF指向了pSon的位置,它可以访问_father,它找不到_son,这样没有问题。但是pS指向了pFather的位置,它访问_father没有问题,但是访问_son时就会产生错误,因为pFather根本没有_son这个变量。

下面是将父类转换为子类指针时,static_cast和dymanic_cast两者不同的表现:

class F

{

public:

    virtual void speak(){};

    int i;

};

 

class S : public F

{

public:

    void speak()

    {

       cout << "S = " << _s << endl;

    }

    double _s;

};

F *pF = new F();

S *pS = static_cast<S*>(pF);

pS->speak();

S1 *pDS = dynamic_cast<S*>(pF);

pDS->speak();

静态的转换编译不显示警告,运行结果不输出(调用F的speak函数)。动态的转换编译显示可能出现不可预期的结果,运行时崩溃。(VS2005时,返回空指针,但是不会崩溃。我认为要是按照C++的特性还是崩溃比较好一点,让程序员容易理解这么做是错误的。)

 

dynamic_cast:

dynamic_cast<type_id>(expression)

本关键字主要处理多态的类型转换,type_id要么是指针类型,要么是引用类型要么是void*。当type_id为指针和void*时,expression必须是type_id类型的指针,当type_id为引用时,expression也必须是type_id类型的引用。#1

 

1.最常用的用法就是将子类指针转换为父类指针。(不举例)

2.当type_id为void*时,指针指向整个对象的空间。

Class A;

A *pA = new A();

void *p = dynamic_cast<void*>(pA);

但是type_id不为void*时,计算机就要在运行时检查是否能够转换。

3.跳级转换。

class A{};

class B : public A{};

class C : public B{};

    A *pA;

    B *pB;

    C *pC = new C();

    pB = dynamic_cast<B*>(pD);  //逐级转换OK

    pA = dynamic_cast<A*>(pB);  //逐级转换OK

    或者

    pA = dynamic_cast<A*>(pC);  //跳级转换OK

    delete pD;

以下情况跳级转换不可以:

class A{};

class B : public A{};

class C : public A{};

class D : public B, public C{};

    A *pA;

    D *pD = new D();

    pA = dynamic_cast<A*>(pB);  //出现错误,是不行的,原因大家都清楚。

 

class A{};

class B : public A{};

class C : public A{};

class D : public B{};

class E : public C, public D{};

    A *pA;

    B *pB;

    E *pE = new E();

    pB = dynamic_cast<B*>(pE);

    pA = dynamic_cast<A*>(pB);  //可以

    pA = dynamic_cast<A*>(pE);  //不可以,原因是很简单的。

    delete pE;

4.两个不相干的类之间转换。

class A {};

class B {};

    A* pa = new A;

    B* pb = dynamic_cast<B*>(pa);   // 不可以,没有相互转换的基础

但是reinterpret_cast可以转换,可以参考reinterpret_cast

 

 

const_cast:

const_cast<type_id>(expression)

这个关键字消除了几个关键字的作用const, volatile,和__unaligned的作用。const经常使用。MSDN有const的例子照抄过来。

class CCTest {

public:

   void setNumber( int );

   void printNumber() const;

private:

   int number;

};

void CCTest::setNumber( int num ) { number = num; }

void CCTest::printNumber() const {

   cout << "/nBefore: " << number;

   const_cast< CCTest * >( this )->number--;//这里消除了const的作用

   cout << "/nAfter: " << number;

}

int main() {

   CCTest X;

   X.setNumber( 8 );

   X.printNumber();

}

 

reinterpret_cast:

reinterpret_cast

这个关键字比较“强悍”,随意转换类型。但是转换错误,就是你的不对了。呵呵,我的原则两个字:“慎用”。

这个关键字可以在任何类型的指针之间转换。

不可以替代const_cast。

不提供安全转换。

MSDN的例子显示出来它的强悍,也显示出了他的脆弱。只要你一个不小心就会乱用。

#include <iostream>

 

// Returns a hash code based on an address

unsigned short Hash( void *p ) {

   unsigned int val = reinterpret_cast<unsigned int>( p );

   return ( unsigned short )( val ^ (val >> 16));

}

 

using namespace std;

int main() {

   int a[20];

   for ( int i = 0; i < 20; i++ )

      cout << Hash( a + i ) << endl;

}

 

 

#1 dynamic_cast的type_id为引用的情况我不准备了解,好像是微软VS2005的特性,而不是标准C++的特性。对于VS6.0我还是感觉比较欣赏的。虽然不如他的新版本那样支持更多的C++特性,但是我自己的感觉是VS的产品在无限的向C#靠拢,无限的向java的易用性靠拢,这样的话C++程序在抑制到别的操作系统时就需要做很大的修改。这也是微软的霸道之处。题外话:微软的vista是一款失败的产品,在vista上微软开发了virtual PC 2007的虚拟机,但是这款产品只支持windows系统的产品安装,对于linux产品他就不支持(只能安装,不能用),因为他不支持24位真彩色。这就说明它的心态是封闭的,而封闭最终导致它的衰败。

#2 safe_cast也是微软的东西,想了解的请参考VS2005的MSDN。

游戏引擎揭秘:大厂为何死磕自研? 游戏引擎本质与商业价值解析 游戏引擎是集成了渲染、物理、动画等核心功能的开发工具包,其价值在于让开发者免于重复编写底层代码,专注于游戏内容创作。商业引擎(如Unity/Unreal)虽降低了开发门槛,但头部厂商仍坚持自研引擎,主要基于以下考量: 经济性:长期项目分摊自研成本后,比商业引擎分成更划算; 可控性:完全掌握底层代码,能针对性优化核心玩法需求; 技术壁垒:专属引擎成为厂商的竞争优势,如米哈游的跨平台渲染技术; 项目适配:超大型游戏(开放世界/MMO)需要深度定制解决方案。 这种"短期高投入 阅读详情

相关推荐

华大 HC32F460 DMA数据传输实战:从配置到中断处理的完整指南

本文提供了华大半导体HC32F460微控制器DMA(直接内存访问)功能的完整实战指南。详细解析了DMA的配置流程、中断处理机制以及软件与硬件触发方式,并附有实验代码示例。通过合理使用DMA进行数据传输,可以显著解放CPU资源,提升嵌入式系统的实时性与运行效率。

weixin_29194255的博客 255

static_cast 和 reinterpret_cast 简介、用法与错误示例

cpp

SimpleLearning 3868

AgentScope实战指南:从源码解析到Qwen模型的多Agent协作开发

本文提供了AgentScope多智能体开发框架的实战指南,详细解析了其核心架构与工作原理,并展示了如何利用Qwen模型构建从单智能体对话到多智能体协作的完整应用。通过两个具体代码实例,指导开发者快速上手环境配置、模型接入与智能体编排,实现高效的多Agent系统开发。

ff678的博客 640

reinterpret_cast与static_cast

reinterpret_cast <new_type> (expression) reinterpret_cast运算符是用来处理无关类型之间的转换;它会产生一个新的值,这个值会有与原始参数(expressoin)有完全相同的比特位。 具体可参阅:C++新式转型之reinterpret_cast reinterpret_cast的字面意思:重新解释(类型的比特位)。 从指针类型到一个足...

qq_40851561的博客 4521

国产NAS哪家强?极空间&绿联&威联通&群晖对比

随着个人数据量暴增,传统网盘空间不足和下载速度慢问题愈发凸显。新势力NAS,作为数据管理领域的璀璨新星,正以其独特的互联网设计理念,引领家庭及小型办公用户向数据存储的新纪元。它不仅仅是一款产品,更是为初学者用户量身定制的贴心伙伴。其系统界面之简洁、操作流程之直观,让人一目了然,真正实现了“即插即用”的极致便捷。同时,新势力NAS在保持专业水准的同时,更提供了多样化的扩展性配置,轻松应对各种数据存储与管理需求,让家庭及小型办公场景下的数据管理变得前所未有的简单与高效。

专注大数据、云计算、人工智能、机器人领域技术传播 3647

Simlink与PX4硬件在环仿真(HIL)实现

Simlink与PX4硬件在环仿真(HIL)实现 介于涉及的知识比较多,这里只是简单的介绍一下,更多内容可以参考阿木实验室《基于matlab模型开发》课程。 硬件在环HIL介绍 simlink与PX4通信实现 硬件在环HIL介绍 为来贯彻万物都可以用数学公式表示,我们以simlink的角度来看我们的无人机,那么UAV可以分为以下的几个模块: 传感器模型 滤波器模块 控制器模...

Zipout的博客 6211

static_cast 和 reinterpret_cast

> 作者: 阙荣文(querw@sina.com) C/C++是强类型语言,不同类型之间的相互转换是比较麻烦的.但是在编程实践中,不可避免的要用到类型转换.有2中类型转换:隐式类型转换和强制类型转换. 1.隐式类型转换 1.1 提升精度,此种是编译器自动完成的,安全的.所以编译的时候不会有任何错误或者警告信息提示. 示例: > P147 int ival = 3; dou

Que's C++ Studio 1万+

Winform从入门到精通(38)——StatusStrip(史上最全)

本文介绍StatusStrip控件的详细用法,包含所有属性和事件,绝对史上最全!

qq_34059233的博客 2758

static_cast 与reinterpret_cast

用法:static_cast &lt; type-id &gt; ( expression ) 该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:   ①用于类层次结构中基类和子类之间指针或引用的转换。   进行上行转换(把子类的指针或引用转换成基类表示)是安全的;   进行下行转换(把基类指针或引用转换成子类表示)时,由...

weixin_33807284的博客 293

ThingsBoard PE专业版解决方案技术文档——温度&湿度

温湿度解决方案

weixin_67440240的博客 819

全新YOLO26有效涨点改进专栏目录 | 本专栏持续更新500+篇内容 | 包含各种卷积、主干网络、各种注意力机制、检测头、损失函数、小目标检测改进、二次创新模块、独家创新等几百种创新点改进

🔥《2026年YOLO26改进专栏》🔥 🚀持续更新500+最前沿创新改进点(顶会顶刊论文/独家创新策略),涵盖主干网络、各种卷积、注意力机制、检测头等模块,助力科研论文发表与模型性能提升,支持检测/分割/分类任务。订阅即获完整可运行项目,提供专业QQ答疑群,适合科研发论文(SCI/CCF/核心)及工业应用(PCB/医学/遥感检测)。专栏价格将逐步上涨,早订更优惠! ⭐特色:非计算机专业友好、模块可自由组合、全网独家创新;📌适用:研究生大论文和小论文创新、小目标检测、多领域科研应用,满足不同研究需求。

Ai缝合怪、助力小伙伴高效发论文 5145

C++11类型转换总结

一、强制类型转换 用C++中的四个强制类型转换的关键字:static_cast,const_cast,reinterpret_cast,dynamic_cast 1 static_cast 1.1 简介 1.2 语法 用法为static_cast<type-id> (expression)。  该运算符把 expression 转换为 type-id 类型,但没有运行时类型检查来保证转换的安全性 1.3 使用场景     (1)用于类层次结构中基类(父类)和派生类(子类)之间.

灰太狼的小秘密 2949

地统计插值学习心得(一)

(创建地统计图层工具用于根据现有的地统计图层或者地统计模型来创建包含新要素数据集的地统计图层,也就是使用构建好的地统计模型用到新的数据集中)这表明,远离极值的区域预测不受极值的影响,并且还表明,包括极值会导致钼元素浓度高的区域周围的预测明显变高。通常,我们使用同一个数据集进行建模和预测,但是在实际插值过程中,这两步的数据可以是不同的,这就是处理极值的诀窍。如果你的数据集有无法忽略的极值时(比如这些钼元素浓度),一种常见的方法是首先显式移除极值进行建模,然后在预测中使用整个数据集(包括极值)。

JData_Engineer的博客 287

【C++ 】:强制类型转换操作符(static_cast、dynamic_cast、const_cast和reinterpret_cast)

c++中的4中操作符形式类型转换 1、static_cast static_cast Operator The expression static_cast < type-id > ( expression ) converts expression to the type of type-id based solely on the types present in the expression. No run-time type check is made to ens..

Mr.Sugarcane 2931

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C++类型转换操作符详解:static_cast、dynamic_cast、const_cast与reinterpret_cast

类型转换是编程语言中处理不同类型数据间操作的基础机制,其核心原理在于改变编译器对特定内存区域数据的解释方式。在C++中,类型系统通过提供安全的转换方式保障程序健壮性,而C风格强制转换因缺乏明确语义和编译期检查,容易引发未定义行为等安全隐患。为此,C++引入了四种具名转换操作符,分别应对不同场景:static_cast用于编译期可确定的类型转换,dynamic_cast依赖RTTI实现运行时安全的下行转换,const_cast专门处理常量性修改,reinterpret_cast则提供底层内存重新解释能力。这些

weixin_30617737的博客 290

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

C++中的四种类型转换操作符:dynamic_cast、static_cast、const_cast、reinterpret_cast

C++中的四种类型转换操作符各有其独特的应用场景和特性。dynamic_cast提供了安全的向下转型能力,static_cast适用于多种编译时类型转换,const_cast用于修改const属性,而reinterpret_cast则用于低层次的重新解释。在实际编程中,应根据具体需求选择合适的类型转换操作符,并遵循最佳实践以确保代码的安全性和可维护性。

373

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C++四种类型转换操作符:const_cast,static_cast, dynamic_cast 以及 reinterpret_cast

1:static_cast( expression )   通常被用来将对象的常量性转除,它是唯一有此能力的C++转型操作符。 2:dynamic_cast( expression )   主要用来执行“安全向下转型”,也就是用来决定某对象是否归属继承体系中的某个类型。它是唯一可能耗费巨大运行成本的转型动作,所以要慎用! 3:reinterpret_cast( expression )

Kingbaiyulong的专栏 488

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

呵呵,今天来好好看看着几个转换操作符的用法。以前老是看着眼熟,但是用着手生。今天决定搞定这些个东西。 在C语言中类型转换有几种方式: 1.      (expression). 在表达式外边加括号,由编译器来决定怎么改变。 2.      new_type(expression). 强制类型括号住表达式。 3.      (new_type)expression. 括号住强制类型。 4.

身是菩提树、心是明镜台、时时勤拂拭、莫使惹尘埃 576

【C++类型转换】static_cast、dynamic_cast、const_cast、reinterpret_cast

中,并在后续标准(C++11/14/17/20)中保持稳定。这四大类型是 C++ 对 C 风格强制转换的现代化、安全化替代方案。在 C 语言中,类型转换通常使用。enum 与整型之间。

普罗米修斯的博客 694

【static_cast、reinterpret_cast、const_cast、dynamic_cast】C++类型转换

因此C++为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符,分别是`static_cast、reinterpret_cast、const_cast`和`dynamic_cast`。

平淡中造就不平凡 1093

数据类型转换操作符:const_cast、static_cast、dynamic_cast以及reinterpret_cast

文章目录数据类型转换const_cast的用法使用const_cast需要注意的问题:static_constdynamic_castreinterpret_cast 数据类型转换 在c++编程中,我们经常需要使用到类型转换,但可能不熟悉c++内置的四种类型转换操作符 它们分别是:const_cast、static_cast、dynamic_cast以及reinterpret_cast,它们的语法形式是统一的,type_cast_operator(expression) const_cast主要用于解除

Wanggj的博客 1302

c++强制类型转换:dynamic_cast、const_cast 、static_cast、reinterpret_cast

dynamic_cast:   通常在基类和派生类之间转换时使用,run-time   castconst_cast:   主要针对const和volatile的转换. static_cast:   一般的转换,no   run-time   check.通常,如果你不知道该用哪个,就用这个。   reinterpret_cast:   用于进行没有任何关联之间的转换,比如一个字符指针转换为一

人在旅途/章鸽 的专栏 2万+

四种类型转换:static_cast,const_cast,reinterpret_cast,dynamic_cast

一、为什么C++中不使用C中的强制类型转换而增加这四种类型转换? C中的强制类型转换看似很强大,可以在任意类型之间转换,不能进行错误检查,容易出错(比如你可以把一个指向const对象的指针转换成指向非const对象的指针,把一个指向基类对象的指针转换成指向一个派生类对象的指针,这两种转换之间的差别是巨大的)。 C风格的转换不容易查找,它由一个括号加上一个标识符组成,这样的东西在C++程序里一大堆。 所以C++为了克服这些缺点,引进了四种新的类型转换操作符。 二、四种类型转换的使用场合 1.静态类型转换:

kingsfar的博客 1328

C++四种cast操作符

C 风格(C-style)强制转型如下:(T) expression  或T(expression) //函数风格(Function-style)两种形式之间没有本质上的不同。对于具有转换的简单类型而言C 风格转型工作得很好。然而,这样的转换符也能不分皂白地应用于类(class)和类的指针。ANSI-C++标准定义了四个新的转换符:reinterpret_cast, static_

starryheavens的专栏 3万+

【C++ 语言】类型转换 ( 转换操作符 | const_cast | static_cast | dynamic_cast | reinterpret_cast | 字符串转换 )

const_cast 转换操作符 static_cast 转换操作符 dynamic_cast 转换操作符 reinterpret_cast 转换操作符 int 与 char* 转换 类型转换代码示例

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 1627
上一篇: Explicit 关键字
下一篇: The serialization primer(序列化入门)
灵魂
博客等级 码龄20年 288粉丝 75原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值