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 明确了转换意图,使代码的含义更加清晰,减少了理解上的困惑。
  • 帮助维护代码:减少了潜在的转换引发的错误,使得在做代码修改时,容易发现因隐式转换而引入的问题。

 

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

阮一峰科技爱好者周刊(第 325 期)推荐工具:一个基于 Next.js 的博客和 CMS 系统

近期&#xff0c;阮一峰在科技爱好者周刊第 325 期中推荐了一款开源工具——ReactPress&#xff0c;ReactPress一个基于 Next.js 的博客和 CMS 系统&#xff0c;可查看 demo站点。&#xff08;fecommunity 投稿&#xff09; ReactPress&#xff1a;一款值得推荐的开源发布平台 …

大学语文教材电子版(第十一版)教学用书PDF及课件

大学语文课件&#xff1a;https://caiyun.139.com/m/i?005CiDusEVWnR 《大学语文》&#xff08;第十一版&#xff09;主编&#xff1a;徐中玉 齐森华 谭帆。 大学语文教材电子版教师用书PDF第一课《齐桓晋文之事》艺术赏析&#xff1a; 孟子四处游说&#xff0c;养成善辩的…

RK356x-8:Wifi模块AP6xxx配置与调试

本文记录如何根据原理图&#xff0c;配置和调试RK356x&#xff08;测试用RK3566&#xff09;主板上wifi/蓝牙模块&#xff08;测试用AP6212&#xff0c;rkwifibt&#xff09;&#xff0c;使其能正确连网。 1.配置SOC接口 1.1 查看原理图&#xff0c;看看wifi模块用的接口是什…

Java基础——网络编程

可以让设备中的程序与网络上其他设备中的程序进行数据交互&#xff08;实现网络通信的&#xff09;。 1. 基本的通信架构 基本的通信架构有2种形式&#xff1a;CS架构&#xff08;Client客户端/Server服务端&#xff09;、BS架构&#xff08;Browser浏览器/Server服务端&…

变分自编码器(VAE, Variational Autoencoder)

代码说明 VAE 模型结构&#xff1a; 编码器将输入数据&#xff08;如 MNIST 图像&#xff09;映射到潜在空间&#xff0c;生成均值 (mu) 和对数方差 (logvar)。 通过重新参数化技巧 (reparameterize) 从正态分布中采样潜在向量 z。 解码器将潜在向量 z 映射回原始空间&#xf…

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

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

多目标优化算法:多目标黑翅鸢算法(MOBKA)求解ZDT1、ZDT2、ZDT3、ZDT4、ZDT6,提供完整MATLAB代码

一、黑翅鸢算法介绍 黑翅鸢优化算法&#xff08;Black-winged Kite Algorithm, BKA&#xff09;是2024年提出的一种元启发式优化算法&#xff0c;其灵感来源于黑翅鸢的迁徙和捕食行为。这种算法通过模拟黑翅鸢在捕食过程中的飞行和搜索策略&#xff0c;被用来解决优化问题&…

记一次Mysql远程连接报错

问题描述&#xff1a; Plugin caching sha2 password could not be loaded: 在wsl2用docker中拉取了mysql镜像&#xff0c;启动后想在win下的环境远程连接到docker中的mysql&#xff0c;报错了&#xff0c;报错如下所示 搜寻了相关的资料发现&#xff0c;在拉下来的myslq版本…

STM32F103移植FreeRTOS

1. 源码下载 在https://www.freertos.org/中下载源码&#xff0c;这里下载的是FreeRTOSv202212.01版本&#xff0c;源码内容解释可参考&#xff1a; https://rtos.100ask.net/zh/FreeRTOS/DShanMCU-F103/chapter7.html#_7-1-freertos%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84拷贝…

CAD多段线两侧偏移(交叉线容易出错)

public void 交叉多段线容易出错(){List<Curve> entse Z.db.SelectEntities<Curve>();List<Polyline> ents Z.db.CurvesToPolyLines(entse);//Z.db.SelectEntities<Polyline>();double offsetDistance 5.0;//偏移距离List<Polyline> resultP…

数据库EVA模式与传统数据库模式 | 分析对比及应用场景

目录 1. 实战场景2. 基本知识3. 应用场景 1. 实战场景 从实战进行探讨以及深入&#xff1a; 事因是同事给我创建表结构的时候&#xff0c;以如下这种方式进行创建&#xff1a; 看到这张表的结构可能会思考&#xff1a; 为啥设备的部件值&#xff08;日期、数值、字符串&…

算法【Java】—— 动态规划之简单多状态 dp 问题

按摩师 https://leetcode.cn/problems/the-masseuse-lcci 状态表示&#xff1a;根据经验和题目要求&#xff0c;达到 i 位置的时候&#xff0c;预约时间最长 接着我们细分状态表示&#xff1a;在遍历数组的时候&#xff0c;到达 i 位置的时候&#xff0c;又两种情况&#xff…

小鸡模拟器 1.8.11 | 街机怀旧重温经典游戏,支持手柄

小鸡模拟器是一款支持多种经典游戏机模拟的游戏应用&#xff0c;包括街机、索尼(SONY)、世嘉、任天堂等主流掌机游戏以及PSP、GBA、NDS、SFC(超级任天堂SNES)、FC(红白机NES)、MD(世嘉MEGA DRIVE)、PS1、PS2等。应用支持手柄完美操作&#xff0c;兼容安卓手柄&#xff0c;让玩家…

Pygame坦克大战游戏开发实验报告

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

Springboot3.3.5 启动流程之 tomcat启动流程介绍

在文章 Springboot3.3.5 启动流程&#xff08;源码分析&#xff09; 中讲到 应用上下文&#xff08;applicationContext&#xff09;刷新(refresh)时使用模板方法 onRefresh 创建了 Web Server. 本文将详细介绍 ServletWebServer — Embedded tomcat 的启动流程。 首先&…

电子应用设计方案-12:智能窗帘系统方案设计

一、系统概述 本设计方案旨在打造便捷、高效的全自动智能窗帘系统。 二、硬件选择 1. 电机&#xff1a;选用低噪音、扭矩合适的智能电机&#xff0c;根据窗帘尺寸和重量确定电机功率&#xff0c;确保能平稳拉动窗帘。 2. 轨道&#xff1a;选择坚固、顺滑的铝合金轨道&…

Javaweb-day12(登录认证)

登录功能 登录校验&#xff08;重点&#xff09; 登录校验指的是在服务器接收到浏览器发送过来的请求之后&#xff0c;首先要对这个请求进行校验&#xff0c;先要校验一下用户登录了没有 怎么来实现登录校验的操作呢&#xff1f;具体的实现思路可以分为两部分&#xff1a; 在…

记录大学Linux运维上机考试题目和流程

备注&#xff1a;今年的Linux操作系统考试已经全部结束&#xff0c;仅作为一个记录和留念 前提&#xff1a;配置环回网卡和环境和nat网卡 1、搭建dns服务器 2、Apache和http服务 3、搭建postfix邮件服务器实现邮件发送 4、搭建vsftpdFTP服务器实现文件上传 题目如下&…

Linux驱动开发第2步_“物理内存”和“虚拟内存”的映射

“新字符设备的GPIO驱动”和“设备树下的GPIO驱动”都要用到寄存器地址&#xff0c;使用“物理内存”和“虚拟内存”映射时&#xff0c;非常不方便&#xff0c;而pinctrl和gpio子系统的GPIO驱动&#xff0c;非常简化。因此&#xff0c;要重点学习pinctrl和gpio子系统下的GPIO驱…

关于强化学习的一份介绍

在这篇文章中&#xff0c;我将介绍与强化学习有关的一些东西&#xff0c;具体包括相关概念、k-摇臂机、强化学习的种类等。 一、基本概念 所谓强化学习就是去学习&#xff1a;做什么才能使得数值化的收益信号最大化。学习者不会被告知应该采取什么动作&#xff0c;而是必须通…