C++ 变量类型与转换
C++ 变量类型与转换
文章目录
- C++ 变量类型与转换
- 变量
- int_t
- size_t与ssize_t
- pid_t
- time_t
- typename
- typeid关键字
- 类型转换
- 编译期类型转换std::static_cast
- 注意事项
- 运行时类型转换std::dynamic_cast
变量
int_t
它是通过typedef定义的,而不是一种新的数据类型。
- int8_t : signed char; //1个字节,用于表示有符号整数,即它可以存储-128到127之间的整数值。
- uint8_t : unsigned char;//1个字节 它用于表示无符号整数,因此它可以存储0到255之间的整数值。
- int16_t : signed short ;
- uint16_t : unsigned short ;
- int32_t : signed int;
- uint32_t : unsigned int;
- int64_t : signed long long;
- uint64_t : unsigned long long;
size_t与ssize_t
size_t是无符号数,ssize_t是有符号数。
- 在32位机器中定义为: unsigned int size_t; (4个字节)
- 在64位机器中定义为: unsigned long size_t;(8个字节)
pid_t
pid_t用它来表示进程id类型。
short pid_t;
time_t
time_t
这种类型就是用来存储从1970年到现在经过了多少秒
#include <iostream>
int main() {time_t t;time(&t);std::cout << t << std::endl;return 0;
}
typename
对于用于模板定义的依赖模板参数的名称,只有在实例化的参数中存在这个类型名,或者这个名称前面使用了typename关键字修饰,编译器才会将这个名字当做是类型。除了以上两种情况,编译器不会将它视为类型。
即,当你想告知编译器iterator是类型而不是变量,只需要用typename:
template<class T>
void foo()
{typename T::iterator * iter;
}
这时,编译器可以确定T::iterator是一个类型,而不需要等到实例化时再确定。
typeid关键字
运行时获知变量类型名称,可以使用 typeid(变量).name()
int ia = 3;
if(typeid(ia) == typeid(int))
{cout <<"int" <<endl;
}
类型转换
编译期类型转换std::static_cast
static_cast
是C++中的一种类型转换运算符,用于执行非多态类型的转换,包括基本数据类型之间的转换、继承体系内的向上转型(把派生类转换为基类)、以及任何没有二义性的转换。与dynamic_cast
不同,static_cast
在编译时期执行类型检查,转换的安全性依赖于程序员的正确性,编译器不会在运行时验证转换是否有效。
- 语法
new_type variable = static_cast<new_type>(expression);
- 特点
编译时检查:转换的合法性在编译时确定,编译器基于类型信息判断转换是否可行,不会考虑对象的实际类型。
不检查多态性:static_cast
不能用于基类和派生类之间(尤其是在继承体系中有多个层级或多态性涉及的情况下)的安全向下转型,这种情况下应使用dynamic_cast
。
广泛性:可以用于基本类型转换、枚举与整数类型间的转换、指针和引用之间的转换(只要它们之间存在继承关系或转换是合法的)、以及类类型之间的显式转换(即使没有继承关系,只要有合适的构造函数或类型转换操作符)。
- 示例
- 基本类型转换:
double d = 3.14;
int i = static_cast<int>(d); // 将浮点数转换为整数
- 向上转型(基类指针/引用转换):
class Base {};
class Derived : public Base {};Derived derivedObj;
Base* basePtr = static_cast<Base*>(&derivedObj); // 向上转型,安全的
- 类类型转换:
class A {
public:explicit A(int) {} // 显式构造函数
};class B {
public:operator A() const { return A(42); } // 类型转换操作符
};B b;
A a = static_cast<A>(b); // 利用类型转换操作符进行转换
注意事项
static_cast
不会检查转换的安全性,特别是当用于向下转型(派生类到基类之外的转换)时,可能会导致未定义行为。- 在使用
static_cast
时,开发者需要确保转换是类型安全的,避免潜在的错误和数据丢失。
总之,static_cast
是一个强大但需要谨慎使用的工具,适用于那些在编译时就能确定安全性的类型转换场景。
运行时类型转换std::dynamic_cast
dynamic_cast
是C++中一个用于执行运行时类型检查和类型转换的关键字。它主要用于多态性的上下文中,允许安全地将一个指向基类对象的指针或引用转换为派生类的指针或引用。与编译时类型转换(如static_cast
)不同,dynamic_cast
会在运行时检查转换的有效性,如果转换不合法(即对象不是目标类型或目标类型的公有派生类),则返回空指针(对于指针类型)或抛出std::bad_cast
异常(对于引用类型)。
- 语法
对于指针类型:
derived_class_ptr = dynamic_cast<derived_class*>(base_class_ptr);
对于引用类型:
derived_class_ref = dynamic_cast<derived_class&>(base_class_ref);
- 特点
动态类型检查:dynamic_cast
在运行时检查转换是否有效。这是通过检查对象的实际类型信息(RTTI,Run-Time Type Information)来完成的,这要求转换的目标类型必须是 polymorphic(拥有至少一个虚函数)。
安全性:因为dynamic_cast
在转换前会进行类型检查,所以它提供了类型转换的安全性,避免了不安全的转换导致的程序错误。
适用范围:只能用于含有虚函数的类层次结构之间进行向下转型(从基类到派生类),或者用于将指针/引用转换为其真实类型(交叉cast,即指向派生类的基类指针/引用转回派生类自身)。
性能影响:由于需要在运行时查询对象类型,dynamic_cast
相比其他类型的cast操作可能会有轻微的性能损失。
- 示例
class Base {
public:virtual ~Base() {}
};class Derived : public Base {};int main() {Base* basePtr = new Derived();// 尝试转换为Derived类型Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);if (derivedPtr) {// 转换成功,可以安全地使用Derived的特性} else {// 转换失败,basePtr实际上并不指向Derived类型的对象}delete basePtr; // 记得释放内存return 0;
}
在这个例子中,如果basePtr
实际指向的是一个Derived
类型的对象,那么dynamic_cast
会成功,并返回一个指向Derived
类型的指针;否则,返回nullptr
。
相关文章:
C++ 变量类型与转换
C 变量类型与转换 文章目录 C 变量类型与转换变量int_tsize_t与ssize_tpid_ttime_t typenametypeid关键字类型转换编译期类型转换std::static_cast注意事项运行时类型转换std::dynamic_cast 变量 int_t 它是通过typedef定义的,而不是一种新的数据类型。 - int8_t…...

【杂七杂八】Huawei Gt runner手表系统降级
文章目录 Step1:下载安装修改版华为运动与健康Step2:在APP里进行配置Step3:更新固件(时间会很长) 目前在使用用鸿蒙4 111版本的手表系统,但是感觉睡眠检测和运动心率检测一言难尽,于是想到是否能回退到以前的版本&…...

FMEA做不出来的原因究竟是什么?——FMEA软件
免费试用FMEA软件-免费版-SunFMEA FMEA(Failure Mode and Effects Analysis)即故障模式与影响分析,是一种旨在识别并预防潜在问题的方法。然而,尽管其重要性被广泛认知,但在实际应用中,却常常遇到FMEA难以…...
pandas ExcelWriter写excel报错openpyxl.utils.exceptions.IllegalCharacterError
一直使用pandas写excel,本次写的数据有大字段,每次写到该字段就报错,代码如下: with pd.ExcelWriter(r".\提数_20240523\tq_type3_doc.xlsx", engineopenpyxl) as writer: df.to_excel(writer,indexFalse, sheet_namesh…...

Golang创建文件夹
方法 package zdpgo_fileimport ("os" )// AddDir 创建文件夹 func AddDir(dir string) error {if !IsExist(dir) {return os.MkdirAll(dir, os.ModePerm)}return nil }测试 package zdpgo_fileimport "testing"func TestAddDir(t *testing.T) {data : […...
头歌OpenGauss数据库-I.复杂查询第5关:至少学了某位学生(Oliver)所学的全部课程的学生
本关任务:根据提供的表和数据,查询至少学了Oliver同学所学的全部课程的其他同学的信息(学号s_id,姓名`s_name)。 student表数据: s_ids_names_sex01Mia女02Riley男03Aria女04Lucas女05Oliver男06Caden男07Lily女08Jacob男course表数据: c_idc_namet_id01Chinese0202Math…...

【数据结构】哈夫曼树和哈夫曼编码
一、哈夫曼树 1.1 哈夫曼树的概念 给定一个序列,将序列中的所有元素作为叶子节点构建一棵二叉树,并使这棵树的带权路径长度最小,那么我们就得到了一棵哈夫曼树(又称最优二叉树) 接下来是名词解释: 权&a…...
深入探索微软Edge:领略新一代浏览器的无限可能
深入探索微软Edge:领略新一代浏览器的无限可能 在当今数字化时代,网络浏览器已经成为我们日常生活中不可或缺的一部分。而随着技术的不断进步,浏览器的功能和性能也在不断提升。微软Edge作为微软推出的全新一代浏览器,引领着浏览…...

JavaScript表达式和运算符
表达式 表达式一般由常量、变量、运算符、子表达式构成。最简单的表达式可以是一个简单的值。常量或变量。例:var a10 运算符 运算符一般用符号来表示,也有些使用关键字表示。运算符由3中类型 1.一元运算符:一个运算符能够结合一个操作数&…...

爬虫实训案例:中国大学排名
近一个月左右的时间学习爬虫,在用所积累的知识爬取了《中国大学排名》这个网站,爬取的内容虽然只是可见的文本,但对于初学者来说是一个很好的练习。在爬取的过程中,通过请求数据、解析内容、提取文本、存储数据等几个重要的内容入…...
C++ IO流
C标准IO流 使用cout进行标准输出,即数据从内存流向控制台(显示器)使用cin进行标准输入,即数据通过键盘输入到程序中使用cerr进行标准错误的输出使用clog进行日志的输出 C文件IO流 文件流对象 ofstream:只写 ofstream 是 C 中用于输出文件…...

debian nginx upsync consul 实现动态负载
1. consul 安装 wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg echo "deb [signed-by/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_r…...
前端基础入门三大核心之HTML篇 —— 同源策略的深度解析与安全实践
前端基础入门三大核心之HTML篇 —— 同源策略的深度解析与安全实践 一、同源策略:定义与起源1.1 定义浅析1.2 何为“源”?1.3 起源与意义 二、同源策略的运作机制2.1 限制范围2.2 安全边界 三、跨越同源的挑战与对策3.1 JSONP3.2 CORS3.3 postMessage 四…...

go 微服务框架 kratos 日志库使用方法及原理探究
一、Kratos 日志设计理念 kratos 日志库相关的官方文档:日志 | Kratos Kratos的日志库主要有如下特性: Logger用于对接各种日志库或日志平台,可以用现成的或者自己实现Helper是在您的项目代码中实际需要调用的,用于在业务代码里…...
VC++位移操作>>和<<以及逻辑驱动器插拔产生的掩码dbv.dbcv_unitmask进行分析的相关代码
VC位移操作>>和<<以及逻辑驱动器插拔产生的掩码dbv.dbcv_unitmask进行分析的相关代码 一、VC位移操作符<<和>>1、右位移操作符 >>:2、左位移操作符 <<: 二、逻辑驱动器插拔产生的掩码 dbv.dbcv_unitmask 进行分析的…...
查看gpu
## 查看gpu信息 if_cuda torch.cuda.is_available() print("if_cuda",if_cuda)gpu_count torch.cuda.device_count() print("gpu_count",gpu_count)...
CSS与表格设计
在网页设计中,表格是一种不可或缺的元素,用于展示和组织数据。虽然HTML提供了基本的表格结构,但通过CSS(层叠样式表)的应用,我们可以极大地提升表格的外观和用户体验。本文将探讨如何利用CSS来设计既美观又…...

阴影映射(线段树)
实时阴影是电子游戏中最为重要的画面效果之一。在计算机图形学中,通常使用阴影映射方法来实现实时阴影。 游戏开发部正在开发一款 2D 游戏,同时希望能够在 2D 游戏中模仿 3D 游戏的光影效果,请帮帮游戏开发部! 给定 x-y 平面上的…...

Docker 容器间通讯
1、虚拟ip/访问 同一网络 安装docker时,docker会默认创建一个内部的桥接网络docker0,每创建一个容器分配一个虚拟网卡,容器之间(包括宿主机)可以根据分配的ip互相访问(ps:其他主机(包括其他主机的容器)无法ping通docker容器ip无法访问&#…...

C语言章节学习归纳--数据类型、运算符与表达式
3.1 C语言的数据类型(理解) 首先,对变量的定义可以包括三个方面: 数据类型 存储类型 作用域 所谓数据类型是按被定义变量的性质,表示形式,占据存储空间的多少,构造特点来划分的。在C语言中&…...

华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...