当前位置: 首页 > news >正文

C++ 类型转换 包括C风格的转换、static_cast、const_cast、reinterpret_cast、dynamic_cast、模板特化等

C++ 类型转换 包括C风格的转换、static_cast、const_cast、reinterpret_cast、dynamic_cast、模板特化等

flyfish

0. 隐式转换(Implicit Conversions)

隐式转换是编译器自动进行的类型转换,通常在需要将一个类型转换为另一个类型以匹配函数参数、赋值或比较时发生。
示例:

#include <iostream>void printInt(int i) {std::cout << "Implicitly converted to int: " << i << std::endl;
}int main() {char c = 'A'; // char类型printInt(c); // char类型隐式转换为int类型return 0;
}

在这个例子中,字符类型char被隐式转换为整数类型int以匹配函数参数类型。

1. C-Style Casts (C风格的转换)

C风格的转换使用括号进行类型转换。这种转换方式功能强大,但缺乏类型安全性,可能导致难以发现的错误。
示例:

#include <iostream>int main() {double d = 9.99;int i = (int)d; // C-Style Caststd::cout << "C-Style Cast: " << i << std::endl;return 0;
}

2. C++风格的转换运算符

static_cast

static_cast用于在相关类型之间进行显式转换,例如从基类指针转换为派生类指针,或者从int转换为double
示例:

#include <iostream>int main() {double d = 9.99;int i = static_cast<int>(d);std::cout << "static_cast: " << i << std::endl;return 0;
}
const_cast

const_cast用于移除或添加const属性。

  • 移除 const 属性:使用 const_castconst 对象转换为非 const 对象,通常用于将 const 对象传递给只能接受非 const 对象的函数。

  • 添加 const 属性:使用 const_cast 将非 const 对象转换为 const 对象,通常用于将非 const 对象传递给只能接受 const 对象的函数。
    示例:

移除 const 属性的示例:
#include <iostream>// 打印非const整型值的函数
void printNonConst(int* x) {*x = 20; // 修改非const整型值std::cout << "Modified value: " << *x << std::endl;
}int main() {const int i = 10; // 定义const整型值// 使用const_cast移除const属性printNonConst(const_cast<int*>(&i));return 0;
}

在这个例子中,printNonConst函数接受一个非constint指针,并修改该值。我们在main函数中定义了一个const整型变量i,然后使用const_cast将其const属性移除,以便将其传递给printNonConst函数进行修改。

添加 const 属性的示例:
#include <iostream>// 打印const整型值的函数
void printConst(const int* x) {std::cout << "Const value: " << *x << std::endl;
}int main() {int i = 10; // 定义非const整型值// 使用const_cast添加const属性printConst(const_cast<const int*>(&i));return 0;
}

在这个例子中,printConst函数接受一个constint指针,并打印该值。我们在main函数中定义了一个非const整型变量i,然后使用const_cast添加其const属性,以便将其传递给printConst函数。

reinterpret_cast

reinterpret_cast用于转换任意类型的指针。它不会检查被转换的类型是否相关,因此需要谨慎使用。
示例:

#include <iostream>int main() {int i = 10;void* p = &i;int* ip = reinterpret_cast<int*>(p);std::cout << "reinterpret_cast: " << *ip << std::endl;return 0;
}
dynamic_cast

dynamic_cast用于在继承层次结构中进行安全的类型转换,只能用于指向多态类型的指针或引用。
示例:

#include <iostream>class Base {
public:virtual ~Base() {}
};class Derived : public Base {
public:void sayHello() {std::cout << "Hello from Derived" << std::endl;}
};int main() {Base* base = new Derived();Derived* derived = dynamic_cast<Derived*>(base);if (derived) {derived->sayHello();} else {std::cout << "dynamic_cast failed" << std::endl;}delete base;return 0;
}

3. Conversion Operators (转换运算符)

从类的对象转换为指定的基本类型或其他类类型
类可以定义成员函数operator type(),实现对象到其他类型的转换。
用户定义的转换通过构造函数和转换运算符实现,允许将类对象转换为内置类型或其他类类型。
示例:

#include <iostream>class Integer {int value;
public:Integer(int v) : value(v) {}operator int() const {return value;}
};int main() {Integer integer(42);int i = integer; // 自动调用转换运算符std::cout << "Conversion Operator: " << i << std::endl;return 0;
}

4. Explicit Conversion Operators (显式转换运算符)

类似于转换运算符,但加上了explicit关键字,防止了隐式转换。这通常用于只有一个参数的转换运算符,以避免意外的类型转换
通过explicit关键字,防止隐式转换。
示例:

#include <iostream>class Integer {int value;
public:Integer(int v) : value(v) {}explicit operator int() const {return value;}
};int main() {Integer integer(42);// int i = integer; // 这行会编译错误,因为转换运算符是显式的int i = static_cast<int>(integer); // 需要显式转换std::cout << "Explicit Conversion Operator: " << i << std::endl;return 0;
}

5. 模板特化(Template Specialization)

模板特化允许为特定类型提供定制的实现,通常用于为特定类型定制转换逻辑。
示例:

#include <iostream>template<typename T>
class Converter {
public:static void convert(const T& value) {std::cout << "Generic conversion: " << value << std::endl;}
};// 对int类型进行特化
template<>
class Converter<int> {
public:static void convert(const int& value) {std::cout << "Specialized conversion for int: " << value << std::endl;}
};int main() {Converter<double>::convert(3.14); // 使用泛型转换Converter<int>::convert(42); // 使用特化转换return 0;
}

输出

Generic conversion: 3.14
Specialized conversion for int: 42

在这个例子中,定义了一个模板类Converter,并对int类型进行了特化,以提供定制的转换逻辑。

相关文章:

C++ 类型转换 包括C风格的转换、static_cast、const_cast、reinterpret_cast、dynamic_cast、模板特化等

C 类型转换 包括C风格的转换、static_cast、const_cast、reinterpret_cast、dynamic_cast、模板特化等 flyfish 0. 隐式转换&#xff08;Implicit Conversions&#xff09; 隐式转换是编译器自动进行的类型转换&#xff0c;通常在需要将一个类型转换为另一个类型以匹配函数参…...

等保通过标准

等保测评&#xff0c;即信息系统安全等级保护测评&#xff0c;是国家对信息系统安全等级保护的一种评估活动。它涉及到安全管理、安全技术、安全运维等多个方面&#xff0c;旨在评定信息系统是否达到了国家设定的安全等级保护标准。等保测评的通过标准通常会根据信息系统的安全…...

reduceByKey 函数详解

reduceByKey 函数详解 实现原理 reduceByKey 函数主要用于处理分布式数据集。它接收两个操作符作为参数&#xff1a; keySelector&#xff1a;这是一个映射函数&#xff0c;用于从输入元素中提取键。 valueReducer&#xff1a;这是另一个函数&#xff0c;用于将具有相同键的…...

CSI-RS在信道中传输的过程

简单介绍CSI-RS信号生成&#xff0c;在信道中传输和接收的过程 1.载波配置 首先需要配置载波相关的参数 系统带宽和子载波间隔 5G NR中&#xff0c;系统带宽和子载波间隔是两个关键参数&#xff0c;共同决定无线资源的分配和使用 系统带宽 5G NR支持广泛的系统带宽&…...

建造者模式(Builder Pattern)工作原理

文章目录 [toc]建造者模式&#xff08;Builder Pattern&#xff09;工作原理一、基本概念二、主要角色三、工作流程&#xff08;一&#xff09;定义产品&#xff08;二&#xff09;定义抽象建造者&#xff08;三&#xff09;定义具体建造者&#xff08;四&#xff09;定义指挥者…...

Ubuntu22.04安装Go语言的几种方式

在 Ubuntu 22.04 上安装 Go 语言可以通过几种不同的方法&#xff0c;以下是两种常见的安装方法&#xff1a; 方法1&#xff1a;使用 go 官方安装脚本 打开终端。 下载 Go 语言的安装脚本&#xff1a; curl -O https://go.dev/dl/go1.22.5.linux-amd64.tar.gz请检查 Go 官方网…...

Typora笔记上传到CSDN

1.Typora 安装 Typora链接&#xff1a;百度网盘 提取码&#xff1a;b6d1 旧版本是不需要破解的 后来的版本比如1.5.9把放在typora的根目录下就可以了 2.上传到CSDN 步骤 csdn 写文章-使用MD编辑器-导入本地md文件即可 问题 图片没法显示 原因 图片的链接是本地的 当然没法…...

Modbus转BACnet/IP网关BA100-配硬件说明

在现代自动化系统中&#xff0c;不同设备和系统之间的通信至关重要&#xff0c;Modbus和BACnet/IP协议虽然各有优势&#xff0c;但它们之间的直接通信存在障碍。钡铼Modbus转BACnet/IP网关作为连接这两种协议的桥梁&#xff0c;允许不同系统之间的无缝数据交换。 一、Modbus转…...

DjangoRF实战-2-apps-users

1、用户模块 创建一个用户模块子应用&#xff0c;用来管理用户&#xff0c;和认证和授权。 1.1根目录创建apps&#xff0c; 为了使用方便&#xff0c;还需要再pycharm中设置一下资源路径&#xff0c;就可以自动提示 1.2注册子应用 1.3添加应用根目录到环境变量path python导…...

java面试题,有synchronized锁,threadlocal、数据可以设置默认值、把redis中的json转为对象

有面试题&#xff0c;有synchronized锁&#xff0c;threadlocal 一、面试题小记二、加锁synchronized1. 先看代码2. synchronized 讲解2.1. 同步代码块2.2. 同步方法2.3. 锁的选择和影响2.4. 注意事项2.5 锁的操作&#xff0c;手动释放锁&#xff0c;显式地获取锁&#xff08;属…...

Apache Spark:深度解析

文章目录 引言Apache Spark 官网链接Spark 的原理1. 核心组件2. 弹性分布式数据集&#xff08;RDD&#xff09;3. 执行模型 基础使用1. 环境搭建2. 示例代码 高级功能1. DataFrame 和 Dataset2. 机器学习3. 流处理 优缺点优点缺点 结论 引言 Apache Spark 是一个快速、通用、可…...

使用umi作为模板如何实现权限管理

三种权限管理的方法&#xff1a; 在做后台管理系统时&#xff0c;难免会使用到权限管理&#xff0c;权限管理方式有三种&#xff0c;分别是&#xff1a;路由、守卫、后端配合。 路由&#xff1a;通过动态路由&#xff0c;根据登录人员不同注册不同的路由&#xff0c;直接让没…...

系统架构设计师教程 第4章 信息安全技术基础知识-4.1 信息安全基础知识-解读

系统架构设计师教程 第4章 信息安全技术基础知识-4.1 信息安全基础知识 4.1.1 信息安全的概念4.1.1.1 信息安全的范围4.1.1.1.1 设备安全4.1.1.1.2 数据安全4.1.1.1.3 内容安全4.1.1.1.4 行为安全 4.1.2 信息存储安全4.1.2.1 信息使用的安全4.1.2.1.1 用户的标识与验证4.1.2.1.…...

【Rust光年纪】探索Rust游戏开发世界:六款引人注目的游戏引擎与框架

探索Rust游戏开发引擎&#xff1a;选择合适的工具 前言 随着Rust语言的不断发展&#xff0c;越来越多的游戏开发者开始将其视作构建游戏引擎和框架的理想选择。本文将介绍几个用于Rust语言的游戏引擎和框架&#xff0c;分别对其核心功能、使用场景、安装与配置以及API进行概览…...

从数据时代到智能时代,星环科技信雅达联合发布金融全栈解决方案

近年来&#xff0c;星环科技与信雅达在金融行业的多个关键领域展开了广泛而深入的合作&#xff0c;推出了一系列面向金融科技领域的联合解决方案。此次合作基于星环科技在大数据、人工智能和云计算领域的先进技术&#xff0c;以及信雅达在金融领域的深厚积累&#xff0c;围绕数…...

自定义维度映射:Kylin Cube设计的高级玩法

自定义维度映射&#xff1a;Kylin Cube设计的高级玩法 在数据仓库领域&#xff0c;Apache Kylin以其高性能的分析能力而闻名。Kylin通过构建多维数据立方体&#xff08;Cube&#xff09;来实现对大数据集的快速查询。Cube设计中的维度映射是优化查询性能的关键环节。本文将探讨…...

c17 新特性 字面量,变量,函数,隐藏转换等

导论 c17新特性引入了许多新的语法&#xff0c;这些语法特性更加清晰&#xff0c;不像传统语法&#xff0c;语义飘忽不定&#xff0c;比如‘a’你根本不知道是宽字符还是UTF-8 字符。以及测试i i&#xff0c;最后结果到底是多少。这种问题很大情况是根据编译器的优化进行猜测&a…...

git操作的一些备忘录

1.回退本地合并 git merge --abort 2.撤销上一次的提交 方法一&#xff1a;(已经提交到git线上仓库了&#xff0c;git reset操作&#xff0c;会把之前提交的都删除&#xff0c;感觉有点危险) 想要让Git回退历史&#xff0c;有以下步骤&#xff1a; 使用git log命令&#xff0c…...

vscode回退不显示了,不方便操作

一、后退前进按钮 顶部显示&#xff0c;方便调试 <—— ——> 文件-> 首选项 -> 设置->commandcenter->勾选 Window: Title Bar Style->custom 将native —>custom...

常见的CSS属性(一)——字体、文本、边框、内边距、外边距、背景、行高、圆角、透明度、颜色值

一、字体 二、文本 三、边框 四、外边距 五、内边距 六、背景 七、行高 八、圆角 九、透明度 九、颜色值 元素的继承性是指给父元素设置了某些属性&#xff0c;子元素或后代元素也会有作用。 一、字体 “font-*”是字体相关的属性&#xff0c;具有继承性。代码如下&a…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...