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

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

广泛性:可以用于基本类型转换、枚举与整数类型间的转换、指针和引用之间的转换(只要它们之间存在继承关系或转换是合法的)、以及类类型之间的显式转换(即使没有继承关系,只要有合适的构造函数或类型转换操作符)。

  • 示例
  1. 基本类型转换
double d = 3.14;
int i = static_cast<int>(d); // 将浮点数转换为整数
  1. 向上转型(基类指针/引用转换)
class Base {};
class Derived : public Base {};Derived derivedObj;
Base* basePtr = static_cast<Base*>(&derivedObj); // 向上转型,安全的
  1. 类类型转换
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定义的&#xff0c;而不是一种新的数据类型。 - int8_t…...

【杂七杂八】Huawei Gt runner手表系统降级

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

FMEA做不出来的原因究竟是什么?——FMEA软件

免费试用FMEA软件-免费版-SunFMEA FMEA&#xff08;Failure Mode and Effects Analysis&#xff09;即故障模式与影响分析&#xff0c;是一种旨在识别并预防潜在问题的方法。然而&#xff0c;尽管其重要性被广泛认知&#xff0c;但在实际应用中&#xff0c;却常常遇到FMEA难以…...

pandas ExcelWriter写excel报错openpyxl.utils.exceptions.IllegalCharacterError

一直使用pandas写excel&#xff0c;本次写的数据有大字段&#xff0c;每次写到该字段就报错&#xff0c;代码如下&#xff1a; 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 哈夫曼树的概念 给定一个序列&#xff0c;将序列中的所有元素作为叶子节点构建一棵二叉树&#xff0c;并使这棵树的带权路径长度最小&#xff0c;那么我们就得到了一棵哈夫曼树&#xff08;又称最优二叉树&#xff09; 接下来是名词解释&#xff1a; 权&a…...

深入探索微软Edge:领略新一代浏览器的无限可能

深入探索微软Edge&#xff1a;领略新一代浏览器的无限可能 在当今数字化时代&#xff0c;网络浏览器已经成为我们日常生活中不可或缺的一部分。而随着技术的不断进步&#xff0c;浏览器的功能和性能也在不断提升。微软Edge作为微软推出的全新一代浏览器&#xff0c;引领着浏览…...

JavaScript表达式和运算符

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

爬虫实训案例:中国大学排名

近一个月左右的时间学习爬虫&#xff0c;在用所积累的知识爬取了《中国大学排名》这个网站&#xff0c;爬取的内容虽然只是可见的文本&#xff0c;但对于初学者来说是一个很好的练习。在爬取的过程中&#xff0c;通过请求数据、解析内容、提取文本、存储数据等几个重要的内容入…...

C++ IO流

C标准IO流 使用cout进行标准输出&#xff0c;即数据从内存流向控制台(显示器)使用cin进行标准输入&#xff0c;即数据通过键盘输入到程序中使用cerr进行标准错误的输出使用clog进行日志的输出 C文件IO流 文件流对象 ofstream&#xff1a;只写 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篇 —— 同源策略的深度解析与安全实践 一、同源策略&#xff1a;定义与起源1.1 定义浅析1.2 何为“源”&#xff1f;1.3 起源与意义 二、同源策略的运作机制2.1 限制范围2.2 安全边界 三、跨越同源的挑战与对策3.1 JSONP3.2 CORS3.3 postMessage 四…...

go 微服务框架 kratos 日志库使用方法及原理探究

一、Kratos 日志设计理念 kratos 日志库相关的官方文档&#xff1a;日志 | Kratos Kratos的日志库主要有如下特性&#xff1a; Logger用于对接各种日志库或日志平台&#xff0c;可以用现成的或者自己实现Helper是在您的项目代码中实际需要调用的&#xff0c;用于在业务代码里…...

VC++位移操作>>和<<以及逻辑驱动器插拔产生的掩码dbv.dbcv_unitmask进行分析的相关代码

VC位移操作>>和<<以及逻辑驱动器插拔产生的掩码dbv.dbcv_unitmask进行分析的相关代码 一、VC位移操作符<<和>>1、右位移操作符 >>&#xff1a;2、左位移操作符 <<&#xff1a; 二、逻辑驱动器插拔产生的掩码 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与表格设计

在网页设计中&#xff0c;表格是一种不可或缺的元素&#xff0c;用于展示和组织数据。虽然HTML提供了基本的表格结构&#xff0c;但通过CSS&#xff08;层叠样式表&#xff09;的应用&#xff0c;我们可以极大地提升表格的外观和用户体验。本文将探讨如何利用CSS来设计既美观又…...

阴影映射(线段树)

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

Docker 容器间通讯

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

C语言章节学习归纳--数据类型、运算符与表达式

3.1 C语言的数据类型&#xff08;理解&#xff09; 首先&#xff0c;对变量的定义可以包括三个方面&#xff1a; 数据类型 存储类型 作用域 所谓数据类型是按被定义变量的性质&#xff0c;表示形式&#xff0c;占据存储空间的多少&#xff0c;构造特点来划分的。在C语言中&…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...