【C++】类型转换

定时移动鼠标点击鼠标,防止电脑息屏的vba脚本 定时移动鼠标,使系统始终处于激活状态,防止系统息屏。 阅读详情

在C++中,类型转换(Type Conversion)是将一种数据类型转换为另一种数据类型的过程。类型转换可以分为两大类:隐式转换(implicit conversion)和显式转换(explicit conversion)。

1. 隐式转换

隐式转换是由编译器自动完成的,不需要显式的类型转换操作符。这种比较简单。常见的隐式转换有以下几种:

1.1 整形提升

char、short 等较小的整数类型可以自动提升为 int。

char c = 'A';
int i = c;  // char 自动提升为 int

1.2 算术转换

不同类型的数据在混合运算时会进行转换,以确保运算的正确性。例如,int 和 double 进行运算时,int 会被转换为 double。

int i = 10;
double d = 3.14;
double result = i + d;  // int 被转换为 double

2. 显示转换

以上都属于C风格的转换格式,简单但是有一些问题,

  • 隐式类型转化有些情况下可能会出问题:比如数据精度丢失。
  • 显式类型转换将所有情况混合在一起,代码不够清晰。

因此C++提出了自己的类型转化风格,注意因为C++要兼容C语言,所以C++中还可以使用C语言的转化风格。

标准C++为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符:

  • static_cast
  • reinterpret_cast
  • const_cast
  • dynamic_cast

2.1 static_cast

static_cast用于非多态类型的转换(静态转换),编译器隐式执行的任何类型转换都可用 static_cast,但它不能用于两个不相关的类型进行转换。

int main()
{
	double d = 12.34;
	int a = static_cast<int>(d);//将d转换为ind
	std::cout << a << std::endl;//输出12
	return 0;
}

两个不相关的类进行转换,会出错。如下:

int main()
{
	double d = 12.34;
	int a = static_cast<int>(d);//将d转化为int
	std::cout << a << std::endl;//输出12
	int* p = static_cast<int*>(a);//将a转化为int*类型 error
	return 0;
}

2.2 reinterpret_cast

reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释,用于将一种类型转换为另一种不同的类型。

int main()
{
	double d = 12.34;
	int a = static_cast<int>(d);//将d转化为int
	std::cout << a << std::endl;//输出12
	//int* p = static_cast<int*>(a);//将a转化为int*类型
	int* p = reinterpret_cast<int*>(a);//将a转化为int*类型

	return 0;
}

reinterpret_cast不进行任何类型安全检查,因此可能会导致未定义行为。它只改变对象的解释方式而不改变对象的存储内容。应尽量减少使用。

2.3 const_cast

const_cast最常用的用途就是删除变量的const属性,方便赋值。

int main()
{
	const int a = 2;
	int* p = const_cast<int*>(&a);
	*p = 3;
	std::cout << a << std::endl;
	std::cout << *p << std::endl;
	return 0;
}

注意:在C++标准中,试图修改一个 const 对象的值会导致未定义行为。这意味着编译器对这个操作不会进行任何保障,程序的结果可能是不确定的,可能导致崩溃、不可预期的输出,甚至可能在不同的编译器或平台上表现出不同的行为。

上面的代码运行结果:

ee536e9d160ee0b873a0230dbf67e3c.png
内存中存放的是3,但是打印显示的是2。

这种属于未定义行为,未定义行为(Undefined Behavior, UB)是指程序的行为没有明确定义的情况,这意味着编译器对代码的行为没有任何规定,程序可以表现出任何结果。会导致程序崩溃红藕这生成错误的结果,看似正常但潜在有安全隐患。应该理解并避免未定义行为。

2.4 dynamic_cast

dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)。

子类转父类 直接转就行了~ 不需要转换,赋值兼容规则。

  • dynamic_cast只能用于父类含有虚函数的类。
  • dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0。
//父类Base
class Base
{
public:
    Base() = default;
    Base(const Base& b) = default;
    virtual ~Base() = default;

    void show()
    {
        std::cout << "Hello Base" << std::endl;
    }
};

//子类Drivaer
class Drivaer : public Base
{
public:
    Drivaer()
        :Base()
    {

    }

    void show()
    {
        std::cout << "Hello Drivaer" << std::endl;
    }
};

int main()
{
    Base* b = new Base;
    Drivaer* d = new Drivaer;

    //将父类指针b转换为子类指针类型
    if (Drivaer* bb1 = dynamic_cast<Drivaer*>(b))
    {
        bb1->show();
    }
    else
    {
        std::cout << "dynamic_cast fail" << std::endl;
    }
    
    
    if (Drivaer* bb2 = static_cast<Drivaer*>(b))
    {
        bb2->show();
    }
    else
    {
        std::cout << "static_cast fail" << std::endl;
    }

}

上面程序运行结果:

image.png

  • 使用dynamic_cast转换失败

因为 b 指向的是 Base 类对象,dynamic_cast 返回 nullptr。在使用 dynamic_cast 进行类型转换时,如果转换不安全(即基类指针指向的对象不是目标派生类的对象),dynamic_cast 将返回 nullptr。

必须让父类指针指向子类的对象才可以转换成功。

image.png

  • static_cast转换成功

static_cast 允许将指针或引用从一个类型转换为另一个相关类型,但不会进行运行时类型检查。因此,如果 static_cast 用于将父类指针或引用转换为子类指针或引用,可能会导致未定义行为(如访问不存在的派生类成员或对象切片问题)。

3. 总结

在 C++ 中,显示转换(Explicit Type Conversion)是通过使用不同的类型转换操作符来实现的,每种操作符都有其特定的用途和适用条件。

  • static_cast

    • 用于编译时类型转换。
    • 支持较宽泛的转换,如整数之间的类型转换、相关类型的指针或引用转换(但不涉及底层 const 属性的转换)、向上和向下的类层次转换(但不进行运行时类型检查)。可能引发未定义行为,慎用。
    • 不能用于在不相关的类之间进行转换。
  • reinterpret_cast

    • 用于将一个指针转换为另一个类型的指针,或者将一个指针转换为一个整数类型,反之亦然。
    • 非常危险,潜在地引入未定义行为。
    • 主要用于低级编程和与硬件相关的编程场景。
  • const_cast

    • 用于移除对象的 const 或 volatile 修饰
    • 主要用于在函数中修改传入参数的 const 属性。
    • 如果使用 const_cast 来修改一个原本声明为 const 的对象,而该对象实际上是 const 的(例如通过字面常量或者通过 const 对象的指针进行转换),则会导致未定义行为。慎用。
  • dynamic_cast

    • 用于运行时类型检查,主要用于类层次间的安全向下转型(Downcasting)
    • 只能用于含有虚函数的类(多态类型)。
    • 如果转换不安全,返回 nullptr(对于指针)或抛出 bad_cast 异常(对于引用)。

总的来说,要避免未定义行为,应当遵循以下原则:

  • 尽量避免使用 reinterpret_cast,除非绝对必要且非常清楚其风险。
  • 在使用 const_cast 时,确保转换是安全的,并且不会尝试修改本来应该是 const 的对象。
  • 使用 static_cast 和 dynamic_cast 时,确保类型之间有合理的转换关系,并避免不相关类型之间的转换。父类转子类安安全全使用dynamic_cast。
智能小车倒车入库功能的实现(python,cpp,ubuntu) 阅读详情

相关推荐

卷积神经网络-猫狗识别(附源码)

利用python实现一个卷积神经网络,训练猫狗数据集,实现对猫狗图片的预测识别

m0_63223213的博客 2万+

C++之数据类型转换(全)

当我们用C++编写代码时,经常会遇到数据类型的转换,如string,char*,char[],const char*、Qstring以及int,float等各种类型之间的转换。而且有些转换的函数在低版本的C++中是不支持的,所幸这里我们对C++中常用的数据类型转换进行记录。在数据转换中,尤其是字符串转换是最常用的,所以我们以字符串来作为整个数据类型转换的核心。

suren_jun的博客 3万+

别再羡慕专业版!用这个批处理脚本,一键给Win11家庭版装上官方沙盒

本文详细介绍了如何通过批处理脚本在Windows 11家庭版上安装官方Windows沙盒(Windows Sandbox),无需复杂操作即可享受专业版功能。脚本自动激活系统内置组件,提供安全隔离的虚拟化环境,适用于软件测试、安全浏览等场景。

weixin_26757925的博客 495

(C++)的数据类型转换

C语言类型 隐式----自动转换 char a = 'a'; int b = a; 显示---强制转换 ---- () ----不管目标类型是什么,都可以将源类型转换过去,属于比较暴力行为 int a = 100; char b = (char)a; C++,除了继承C语言中的类型转换之外(不推荐),还提供四种类型转换方式 static_cast 静态类型转换,它大多数情况下,跟C语言类型转换差不多 reinterpret_cast 重新解释强制类型转换,一般指针使用 dynami

cat_eat_fish 4673

别再手动更新Excel了!用Jira看板管理你的个人项目(附保姆级配置流程)

本文详细介绍了如何利用Jira看板替代Excel进行个人项目管理,提供从注册到配置的保姆级教程。通过极简看板模式、自动化规则和数据分析功能,帮助用户实现任务可视化、协作高效化和提醒自动化,大幅提升个人工作效率。特别适合需要管理复杂个人项目的用户。

weixin_42699679的博客 229

Ubuntu22.04 apt 安装 ROS1 ROS Noetic Ninjemys

ubuntu 22.04 apt-get 安装 ros1 ros Noetic 最新版

autolabor的博客 5万+

C++的类型转换

c++类型转换

rayn的专栏 3443

路径规划:D*Lite寻路算法详解

D*Lite详解目录

mkr67n的博客 2万+

掌握C++类型转换:static_cast、const_cast、dynamic_cast 和 reinterpret_cast

静态类型转换静态类型转换是最常用的类型转换方式,它可以将一种类型的数据强制转换为另一种类型,但需要注意的是,这种转换可能会损失一些信息,因此在进行此类转换时应当谨慎。int a = 10;动态类型转换动态类型转换主要用于多态类型之间的转换,它可以将基类指针或引用转换为派生类指针或引用。如果进行非法的类型转换,动态类型转换会返回一个空指针。重新解释类型转换。

Lion_Long的博客 6389

【GlobalMapper精品教程】072:GlobalmapperV25中文版下载地址及安装教程

GlobalmapperV25中文版下载地址及安装教程安装包位于专栏完整数据包中,请订阅后从优快云私信查收!最新GlobalMapper中文版入门实战实验教程,图文并茂,实用性强,内容包括:GM基础操作、数据处理及地形图制作、航测内业数据处理、点云处理、地形分析、空间分析、数据库建库入库等。配套完整案例数据,持续同步更新!订阅专栏后,从私信查收中文安装包永久版(中文23.0+24.0)及配套实验数据包。

智慧空间实验室 4734

增量学习入门:概念、代码示例与应用场景

在当今快速变化的数据环境中,传统的机器学习模型往往需要重新训练以适应新的数据。然而,这种方法不仅耗时耗力,还可能导致模型性能的不稳定。增量学习(Incremental Learning)作为一种新兴的学习范式,能够在新数据到来时动态更新模型,而无需重新训练整个模型。本文将详细介绍增量学习的基本概念、代码示例、应用场景以及需要注意的事项。增量学习作为一种高效的机器学习方法,能够在新数据到来时动态更新模型,具有广泛的应用前景。通过本文的介绍,相信你对增量学习有了初步的了解。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 1152

C/C++数据类型转换详解

自动类型转换常被称为隐式类型转换,强制类型转换常被称为显示类型转换,强制类型转换的一般形式为(类型标识符)(操作数)或(类型标识符)(表达式)。其功能就是把操作数或表达式结果的数据类型暂时地强制转换为圆括号()中的类型。

weixin_44049823的博客 6994

ESP32 VSCode开发环境配置

ESP32 VSCode开发环境配置

qq_53529450的博客 507

[cpp进阶]C++类型转换

当我们在函数中用父类的指针或引用接受参数时,接收的参数有可能指向父类对象也有可能指向子类对象,当接收的参数指向父类对象时,不需要做任何处理,当接收的参数指向子类对象时,有时就需要将该对象转换为原来的子类对象。

weixin_53027918的博客 1143

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【C++】特殊类的设计、单例模式以及Cpp类型转换

本文深入探讨C++中特殊类的设计方法与类型转换机制。针对特殊类设计,详细解析如何实现禁止拷贝、限制对象创建于堆/栈、防止继承及单例模式(饿汉与懒汉),并分析其应用场景与线程安全问题。在类型转换部分,系统介绍C++四种强制转换操作符(static_cast、reinterpret_cast、const_cast、dynamic_cast)的原理与适用场景,剖析隐式转换的潜在风险(如数据截断与死循环),并对比C风格转换的缺陷。通过实例代码与场景分析,帮助开发者掌握高效、安全的编程实践,提升代码健壮性与可维护性。

2303_77756141的博客 2235

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Cpp||类型转换

Cpp类型转换 文章目录Cpp类型转换1:c语言中的类型转换1.1:隐式类型转换:意义相似的类型1.2: 强制类型转换:意义差距较大的类型2:C++中的类型转换2.1:static_cast2.2:reinterpret_cast2.3:const_cast2.4:dynamic_cast 1:c语言中的类型转换 1.1:隐式类型转换:意义相似的类型 int main(){ int a=2; ...

Template Code 851

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

cpp 类型转换

cpp 丰富的类型允许根据不同的需求选择不同的类型,这也使计算机的操作更复杂。例如,将两个short值相加涉及到的硬件编译指令可能会与将两个long值相加不同。由于有11中整型和3种浮点类型,因此计算机需要处理大量不同的情况,尤其是对不同的类型进行运算时,为处理这种潜在的混乱,cpp自动执行很多类型转换: 将一种算术类型的值赋给另一种算术类型的变量时,cpp将对值进行转换; 表达式中包含不同的类型时,cpp将对值进行转换; 将参数传递给函数时,cpp将对值进行转换; 1.初始化和赋值...

liguandong 2381

【C++】—— C++的类型转换

C++的类型转换详解

m0_56069910的博客 3674

C++强制类型转换

C++ 类型转换(C风格的强制转换): 在C++基本的数据类型中,可以分为四类:整型,浮点型,字符型,布尔型。其中数值型包括 整型与浮点型;字符型即为char。 (1)将浮点型数据赋值给整型变量时,舍弃其小数部分。 (2)将整型数据赋值给浮点型变量时,数值不变,但是以指数形式存储。 (3)将double型数据赋值给float型变量时,注意数值范围溢出。 (4)字符型数据可以赋值给整型变量,此时存入的是字符的ASCII码。 (5)将一个int,short或long型数据赋值给一个char型变量,只

q610098308的专栏 6万+

【C++】四种强制类型转换

C++ 四种强制类型转换   C语言中的强制类型转换(Type Cast)有显式和隐式两种,显式一般就是直接用小括号强制转换,TYPE b = (TYPE)a; 隐式就是直接 float b = 0.5; int a = b; 这样隐式截断(by the way 这样隐式的截断是向 0 取整的,我喜欢这么叫因为 0.9 会变成 0,1.9 变成 1,-0.9 变成 0,-1.9 变成 -1)。  ...

Bob__yuan的博客 4万+

cpp 4个类型转换

static_cast、dynamic_cast、reinterpret_cast、const_cast 之间的区别 static_cast 用法:static_cast (expression) 说明:该运算符把expression转换为typeid类型,但没有运行时类型检查来确保转换的安全性。 用途: 用于类层次结构中基类和派生类之间指针或者引用的转换。up-casting (把派生类的指...

weixin_33984032的博客 1045

Cpp_类型转换

C风格的类型转换C++完全兼容。C++新增了四个显式类型转换运算符。 1)静态类型转换:static_cast<目标类型> A.将基类的指针或引用转换为子类的指针或引用; B.自定义类型转换。它允许子类类型的指针转换为父类类型的指针(这是一个有效的隐式转换),同时,也能够执行相反动作:转换父类为它的子类,但会给出编译警告下面的例子中,被转换的父类没有被检查是否与目的类型相一致。class Ba

Jerry的专栏 1022

C++ 类型转换

隐式类型转换 1 数值类型转换 2 指针类型转换 显式类型转换 1 explicit关键字 1 强制类型转换 11 static_cast 12 dynamic_cast 13 const_cast 14 reinterpret_cast 参考资料 C++类型转换大体上包括隐式类型转换和显式类型转换。1. 隐式类型转换隐式类型转换是自动执行的,无需显式的操作符。 隐式类型转换发生在很多地方,比如函数

shuzfan的专栏 1万+

【C++】C++的类型转换

本篇文章概要性地介绍了C语言与C++中的类型转换机制。首先,回顾了C语言中的类型转换方式。然后,阐述了C++为何需要四种强制类型转换(static_cast、reinterpret_cast、const_cast、dynamic_cast),以适应其面向对象的特性及复杂的类层次结构。接着,详细说明了这四种强制类型转换的使用场景与特点。此外,简要介绍了RTTI(运行时类型识别)的概念。希望本篇文章对大家学习C++类型转换有所帮助。

是阿建吖! 900

C++四种强制类型转换

文章目录1 C++类型转换本质1.1 自动类型转换(隐式)1.2 强制类型转换(显式)1.3 类型转换的本质1.4 类型转换的安全性2 四种类型转换运算符2.1 C语言的强制类型转换与C++的区别3 static_cast4 reinterpret_cast5 const_cast6 dynamic_cast6.1 向上转型(Upcasting)6.2 向下转型(Downcasting) 1 C++类型转换本质 1.1 自动类型转换(隐式) 利用编译器内置的转换规则,或者用户自定义的转换构造函数以及类型转换

u_hcy2000的博客 1万+
上一篇: 【MySQL】 -- 用户管理
下一篇: 【Qxlxs】打包成库供项目使用
C++下等马
博客等级 码龄5年 776粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C++下等马

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值