C/C++中有那些类型转换方式?分别有什么作用?

目录

隐式类型转换

显示类型转换

C风格 

C++风格

static_case

dynamic_cast

const_cast

reinterpret_cast

构造函数转换

类型转换运算符

使用 explicit 的好处


在 C/C++ 中,类型转换是将一种数据类型的值转换为另一种数据类型的过程。

隐式类型转换

  • 定义:编译器自动进行的类型转换,通常发生在表达式计算过程中。
  • 作用:当需要将一个较小的数据类型(如 int)赋值给一个较大的数据类型(如 float)时,编译器会自动将 int 转换为 float
int a = 10;  
float b = a; // 隐式转换,a 从 int 转换为 float

显示类型转换

  • 定义:程序员手动指定的类型转换,使用强制类型转换运算符。
  • 作用:在需要明确转换类型时使用,比如将 float 转换为 int,强制丢弃小数部分。

C风格 

float x = 5.5;  
int y = (int)x; // 显式转换,结果为 5

C++风格

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

static_case

用于安全地进行基本类型之间的转换,如整数和浮点数之间。但它不能用于两个不相关的类型进行转换。

int a = 10;  
float b = static_cast<float>(a); // 安全的转换


int i3 = static_cast<int> (a);//安全转换

dynamic_cast

用于在运行时进行类层次结构中的转换,主要用于多态类型(具有虚函数的类)。

Base* basePtr = new Derived();  
Derived* derivedPtr = dynamic_cast<Derived*>(basePtr); // 安全转换

const_cast

用于添加或去掉变量的 const 属性。

const int a = 10;  
int* b = const_cast<int*>(&a); // 去掉 const,警告:未定义行为

reinterpret_cast

用于低级别的指针转换,可以在 incompatible types 之间进行强制转换。

long p = 0x123456;  
int* q = reinterpret_cast<int*>(p); // 低级别的指针转换

构造函数转换

  • 定义:使用类构造函数将其他类型的值显式转换为类对象。
  • 作用:有时需要将基本数据类型转换为类对象,通过构造函数实现。
  • explicit:explicit关键字主要用于构造函数和转换运算符,它的作用是防止隐式类型转换

class MyClass {  
public:  
    MyClass(int x) { /* ... */ } // 没有 explicit,会允许隐式转换  
};  

// 隐式转换  
MyClass obj = 10; // 合法,调用 MyClass(int)  

// 改为显式构造函数  
class MyClassExplicit {  
public:  
    explicit MyClassExplicit(int x) { /* ... */ } // 使用 explicit  
};  

// 没有隐式转换  
MyClassExplicit obj2 = 10; // 错误:无法从 int 转换为 MyClassExplicit  
MyClassExplicit obj3(10);  // 合法:显式调用构造函数

类型转换运算符

  • 定义:用户自定义的转换函数,可以将类对象转换成其他类型。
  • 作用:通过重载类型转换运算符,可以实现类对象到基本数据类型的转换。
  • explicit:如果类中定义了类型转换运算符,标记为explicit可以同样禁止隐式转换。只有在明确调用时,才能使用该转换。

 没用explicit时:

//没用explixit时

class MyClass {  
public:  
    operator int() const { return 42; } // 转换为 int  
};  

MyClass obj;  
int a = obj; // 调用转换运算符

 用explicit时:

class MyClass {  
public:  
    explicit operator int() const { return 42; } // 使用 explicit  
};  

// 隐式转换  
MyClass obj;  
int a = obj; // 错误:无法进行隐式转换  

// 显式调用  
int b = static_cast<int>(obj); // 合法:显式转换

使用 explicit 的好处

  • 增强代码安全性:通过禁止隐式转换,可以避免由于意外的类型转换而引起的错误。
  • 提高可读性:使用 explicit 明确了转换意图,使代码的含义更加清晰,减少了理解上的困惑。
  • 帮助维护代码:减少了潜在的转换引发的错误,使得在做代码修改时,容易发现因隐式转换而引入的问题。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/917518.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【STM32】基于SPI协议读写SD,详解!

文章目录 0 前言1 SD卡的种类和简介1.1 SD卡的种类1.2 SD卡的整体结构1.3 SD卡运行机制——指令和响应2 SD卡的通信总线2.1 SDIO2.2 SPI3 硬件连接4 代码实践【重点】4.1 HAL库移植4.2 标准库移植4.3 遇到的问题和解决方案5 扩展阅读0 前言 因为项目需要,使用stm32读写sd卡,这…

ZooKeeper单机、集群模式搭建教程

单点配置 ZooKeeper在启动的时候&#xff0c;默认会读取/conf/zoo.cfg配置文件&#xff0c;该文件缺失会报错。因此&#xff0c;我们需要在将容器/conf/挂载出来&#xff0c;在制定的目录下&#xff0c;添加zoo.cfg文件。 zoo.cfg logback.xml 配置文件的信息可以从二进制包…

如何在Mysql中生成0-23完整的小时数据

目录 1. 创建表2. 插入0-23小时的数据3. 查询并合并数据 在数据分析中&#xff0c;我们经常需要对特定时间段内的数据进行统计和分析。 例如&#xff0c;在名片进线的场景中&#xff0c;我们可能需要了解一天内每小时的名片进线数量。 然而&#xff0c;由于某些时间点可能没有数…

厦门凯酷全科技有限公司正规吗?

在这个短视频风起云涌的时代&#xff0c;抖音作为电商领域的黑马&#xff0c;正以惊人的速度改变着消费者的购物习惯与品牌的市场策略。在这场变革中&#xff0c;厦门凯酷全科技有限公司凭借其专业的抖音电商服务&#xff0c;在众多服务商中脱颖而出&#xff0c;成为众多品牌信…

SpringBoot配置类

在Spring Boot中&#xff0c;配置类是一种特殊的类&#xff0c;用于定义和配置Spring应用程序的各种组件、服务和属性。这些配置类通常使用Java注解来声明&#xff0c;并且可以通过Spring的依赖注入机制来管理和使用。 Spring 容器初始化时会加载被Component、Service、Reposi…

ADS项目笔记 1. 低噪声放大器LNA天线一体化设计

在传统射频结构的设计中&#xff0c;天线模块和有源电路部分相互分离&#xff0c;两者之间通过 50 Ω 传输线级联&#xff0c;这种设计需要在有源电路和天线之间建立无源网络&#xff0c;包括天线模块的输入匹配网络以及有源电路的匹配网络。这些无源网络不仅增加了系统的插入损…

Vue2+ElementUI:用计算属性实现搜索框功能

前言&#xff1a; 本文代码使用vue2element UI。 输入框搜索的功能&#xff0c;可以在前端通过计算属性过滤实现&#xff0c;也可以调用后端写好的接口。本文介绍的是通过计算属性对表格数据实时过滤&#xff0c;后附完整代码&#xff0c;代码中提供的是死数据&#xff0c;可…

【目标检测】用YOLOv8-Segment训练语义分割数据集(保姆级教学)

前言 这篇教程会手把手带你用 YOLOv8-Segment 搭建一个属于自己的分割任务项目。从环境配置到数据集准备&#xff0c;再到模型训练和测试&#xff0c;所有步骤都有详细说明&#xff0c;适合初学者使用。你将学会如何安装必要的软件&#xff0c;标注自己的数据&#xff0c;并使…

Elasticsearch:管理和排除 Elasticsearch 内存故障

作者&#xff1a;来自 Elastic Stef Nestor 随着 Elastic Cloud 提供可观察性、安全性和搜索等解决方案&#xff0c;我们将使用 Elastic Cloud 的用户范围从完整的运营团队扩大到包括数据工程师、安全团队和顾问。作为 Elastic 支持代表&#xff0c;我很乐意与各种各样的用户和…

前深度学习时代-经典的推荐算法

参考自《深度学习推荐系统》—— 王喆&#xff0c;用于学习记录。 1.协同过滤 “协同过滤”就是协同大家的反馈、评价和意见一起对海量的信息进行过滤&#xff0c;从中筛选出目标用户可能感兴趣的信息的推荐过程。 基于用户相似度进行推荐的协同过滤算法 UserCF 用户相似度…

两行命令搭建深度学习环境(Docker/torch2.5.1+cu118/命令行美化+插件),含完整的 Docker 安装步骤

深度学习环境的配置过于繁琐&#xff0c;所以我制作了两个基础的镜像&#xff0c;希望可以帮助大家节省时间&#xff0c;你可以选择其中一种进行安装&#xff0c;版本说明&#xff1a; base 版本基于 pytorch/pytorch:2.5.1-cuda11.8-cudnn9-devel&#xff0c;默认 python 版本…

WebRTC视频 04 - 视频采集类 VideoCaptureDS 中篇

WebRTC视频 01 - 视频采集整体架构 WebRTC视频 02 - 视频采集类 VideoCaptureModule WebRTC视频 03 - 视频采集类 VideoCaptureDS 上篇 WebRTC视频 04 - 视频采集类 VideoCaptureDS 中篇&#xff08;本文&#xff09; WebRTC视频 05 - 视频采集类 VideoCaptureDS 下篇 一、前言…

AI在电商平台中的创新应用:提升销售效率与用户体验的数字化转型

1. 引言 AI技术在电商平台的应用已不仅仅停留在基础的数据分析和自动化推荐上。随着人工智能的迅速发展&#xff0c;越来越多的电商平台开始将AI技术深度融合到用户体验、定价策略、供应链优化、客户服务等核心业务中&#xff0c;从而显著提升运营效率和用户满意度。在这篇文章…

Blossom:开源私有部署的markdown笔记软件

在信息化、数字化时代&#xff0c;我们每个人的生活和工作都离不开笔记和知识管理。从简单的待办事项&#xff0c;到复杂的项目计划&#xff0c;再到存储大量个人知识的工具&#xff0c;如何选择一个高效、便捷且符合个人需求的笔记软件&#xff0c;成了许多人的难题。最近在逛…

Linux debian系统安装ClamTk开源图形用户界面(GUI)杀毒软件

一、ClamTk简介 ClamTk 是一个基于 ClamAV 的开源图形用户界面&#xff08;GUI&#xff09;杀毒软件。它使用 GTK2-Perl 脚本构建而成&#xff0c;支持32位与64位操作系统。ClamTk 提供了一个直观的用户界面&#xff0c;使得用户无需深入了解命令行即可完成大部分操作。它具备…

Linux 进程信号的产生

目录 0.前言 1. 通过终端按键产生信号 1.1 CtrlC&#xff1a;发送 SIGINT 信号 1.2 Ctrl\&#xff1a;发送 SIGQUIT 信号 1.3 CtrlZ&#xff1a;发送 SIGTSTP 信号 2.调用系统命令向进程发信号 3.使用函数产生信号 3.1 kill 函数 3.2 raise 函数 3.3 abort 函数 4.由软件条件产…

【大数据学习 | HBASE高级】hive操作hbase

一般在查询hbase的数据的时候我们可以直接使用hbase的命令行或者是api进行查询就行了&#xff0c;但是在日常的计算过程中我们一般都不是为了查询&#xff0c;都是在查询的基础上进行二次计算&#xff0c;所以使用hbase的命令是没有办法进行数据计算的&#xff0c;并且对于hbas…

微信小程序 https://thirdwx.qlogo.cn 不在以下 downloadFile 合法域名列表中

授权登录后&#xff0c;拿到用户头像进行加载&#xff0c;但报错提示&#xff1a; https://thirdwx.qlogo.cn 不在以下 downloadFile 合法域名列表中 解决方法一&#xff08;未完全解决&#xff0c;临时处理&#xff09;&#xff1a;在微信开发者工具将不校验...勾上就可以访问…

rk3399开发环境使用Android 10初体验蓝牙功能

版本 日期 作者 变更表述 1.0 2024/11/10 于忠军 文档创建 零. 前言 由于Bluedroid的介绍文档有限&#xff0c;以及对Android的一些基本的知识需要了(Android 四大组件/AIDL/Framework/Binder机制/JNI/HIDL等)&#xff0c;加上需要掌握的语言包括Java/C/C等&#xff0…

1. Django中的URL调度器 (项目创建与简单测试)

1. 创建 Django 项目 运行以下命令创建一个名为 blog_project 的 Django 项目&#xff1a; django-admin startproject blog_project2. 创建博客应用 Django 中&#xff0c;项目可以包含多个应用。创建一个名为 blog 的应用&#xff1a; cd blog_project python manage.py …