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_cast将const对象转换为非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函数接受一个非const的int指针,并修改该值。我们在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函数接受一个const的int指针,并打印该值。我们在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. 隐式转换(Implicit Conversions) 隐式转换是编译器自动进行的类型转换,通常在需要将一个类型转换为另一个类型以匹配函数参…...
等保通过标准
等保测评,即信息系统安全等级保护测评,是国家对信息系统安全等级保护的一种评估活动。它涉及到安全管理、安全技术、安全运维等多个方面,旨在评定信息系统是否达到了国家设定的安全等级保护标准。等保测评的通过标准通常会根据信息系统的安全…...
reduceByKey 函数详解
reduceByKey 函数详解 实现原理 reduceByKey 函数主要用于处理分布式数据集。它接收两个操作符作为参数: keySelector:这是一个映射函数,用于从输入元素中提取键。 valueReducer:这是另一个函数,用于将具有相同键的…...
CSI-RS在信道中传输的过程
简单介绍CSI-RS信号生成,在信道中传输和接收的过程 1.载波配置 首先需要配置载波相关的参数 系统带宽和子载波间隔 5G NR中,系统带宽和子载波间隔是两个关键参数,共同决定无线资源的分配和使用 系统带宽 5G NR支持广泛的系统带宽&…...
建造者模式(Builder Pattern)工作原理
文章目录 [toc]建造者模式(Builder Pattern)工作原理一、基本概念二、主要角色三、工作流程(一)定义产品(二)定义抽象建造者(三)定义具体建造者(四)定义指挥者…...
Ubuntu22.04安装Go语言的几种方式
在 Ubuntu 22.04 上安装 Go 语言可以通过几种不同的方法,以下是两种常见的安装方法: 方法1:使用 go 官方安装脚本 打开终端。 下载 Go 语言的安装脚本: curl -O https://go.dev/dl/go1.22.5.linux-amd64.tar.gz请检查 Go 官方网…...
Typora笔记上传到CSDN
1.Typora 安装 Typora链接:百度网盘 提取码:b6d1 旧版本是不需要破解的 后来的版本比如1.5.9把放在typora的根目录下就可以了 2.上传到CSDN 步骤 csdn 写文章-使用MD编辑器-导入本地md文件即可 问题 图片没法显示 原因 图片的链接是本地的 当然没法…...
Modbus转BACnet/IP网关BA100-配硬件说明
在现代自动化系统中,不同设备和系统之间的通信至关重要,Modbus和BACnet/IP协议虽然各有优势,但它们之间的直接通信存在障碍。钡铼Modbus转BACnet/IP网关作为连接这两种协议的桥梁,允许不同系统之间的无缝数据交换。 一、Modbus转…...
DjangoRF实战-2-apps-users
1、用户模块 创建一个用户模块子应用,用来管理用户,和认证和授权。 1.1根目录创建apps, 为了使用方便,还需要再pycharm中设置一下资源路径,就可以自动提示 1.2注册子应用 1.3添加应用根目录到环境变量path python导…...
java面试题,有synchronized锁,threadlocal、数据可以设置默认值、把redis中的json转为对象
有面试题,有synchronized锁,threadlocal 一、面试题小记二、加锁synchronized1. 先看代码2. synchronized 讲解2.1. 同步代码块2.2. 同步方法2.3. 锁的选择和影响2.4. 注意事项2.5 锁的操作,手动释放锁,显式地获取锁(属…...
Apache Spark:深度解析
文章目录 引言Apache Spark 官网链接Spark 的原理1. 核心组件2. 弹性分布式数据集(RDD)3. 执行模型 基础使用1. 环境搭建2. 示例代码 高级功能1. DataFrame 和 Dataset2. 机器学习3. 流处理 优缺点优点缺点 结论 引言 Apache Spark 是一个快速、通用、可…...
使用umi作为模板如何实现权限管理
三种权限管理的方法: 在做后台管理系统时,难免会使用到权限管理,权限管理方式有三种,分别是:路由、守卫、后端配合。 路由:通过动态路由,根据登录人员不同注册不同的路由,直接让没…...
系统架构设计师教程 第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游戏开发引擎:选择合适的工具 前言 随着Rust语言的不断发展,越来越多的游戏开发者开始将其视作构建游戏引擎和框架的理想选择。本文将介绍几个用于Rust语言的游戏引擎和框架,分别对其核心功能、使用场景、安装与配置以及API进行概览…...
从数据时代到智能时代,星环科技信雅达联合发布金融全栈解决方案
近年来,星环科技与信雅达在金融行业的多个关键领域展开了广泛而深入的合作,推出了一系列面向金融科技领域的联合解决方案。此次合作基于星环科技在大数据、人工智能和云计算领域的先进技术,以及信雅达在金融领域的深厚积累,围绕数…...
自定义维度映射:Kylin Cube设计的高级玩法
自定义维度映射:Kylin Cube设计的高级玩法 在数据仓库领域,Apache Kylin以其高性能的分析能力而闻名。Kylin通过构建多维数据立方体(Cube)来实现对大数据集的快速查询。Cube设计中的维度映射是优化查询性能的关键环节。本文将探讨…...
c17 新特性 字面量,变量,函数,隐藏转换等
导论 c17新特性引入了许多新的语法,这些语法特性更加清晰,不像传统语法,语义飘忽不定,比如‘a’你根本不知道是宽字符还是UTF-8 字符。以及测试i i,最后结果到底是多少。这种问题很大情况是根据编译器的优化进行猜测&a…...
git操作的一些备忘录
1.回退本地合并 git merge --abort 2.撤销上一次的提交 方法一:(已经提交到git线上仓库了,git reset操作,会把之前提交的都删除,感觉有点危险) 想要让Git回退历史,有以下步骤: 使用git log命令,…...
vscode回退不显示了,不方便操作
一、后退前进按钮 顶部显示,方便调试 <—— ——> 文件-> 首选项 -> 设置->commandcenter->勾选 Window: Title Bar Style->custom 将native —>custom...
常见的CSS属性(一)——字体、文本、边框、内边距、外边距、背景、行高、圆角、透明度、颜色值
一、字体 二、文本 三、边框 四、外边距 五、内边距 六、背景 七、行高 八、圆角 九、透明度 九、颜色值 元素的继承性是指给父元素设置了某些属性,子元素或后代元素也会有作用。 一、字体 “font-*”是字体相关的属性,具有继承性。代码如下&a…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...
