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


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot之@Builder 注解

&#xff08;1&#xff09;Builder 生成的构造器不是完美的&#xff0c;如果没有提供必须的参数&#xff0c;构造器可能会创建出不完整或者不合法的对象&#xff0c;导致代码报错。 Builder 注解产生的 Builder 类的构造方法默认并不能限定必传参数。 &#xff08;2&#xff…

系统架构师-考试-基础题-错题集锦1

系统架构师-考试-基础题-错题集锦 1.当一台服务器出现故障时将业务迁移到另外一台物理服务器上&#xff0c;保障了业务的连续性。 2.面向对象&#xff1a; 实体类&#xff0c;边界类&#xff0c;控制类 3.RUP&#xff1a;UP&#xff0c;统一过程&#xff0c;以架构为中心&am…

LeetCode700二叉搜索树中的搜索

题目描述 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和一个整数值 val。你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在&#xff0c;则返回 null 。 解析 最基本的二叉搜索树的应用&#xff0c;递归或者while循环都可以…

分布式数据库HBase入门指南

目录 概述 HBase 的主要特点包括: HBase 的典型应用场景包括: 访问接口 1. Java API: 2. REST API: 3. Thrift API: 4. 其他访问接口: HBase 数据模型 概述 该模型具有以下特点&#xff1a; 1. 面向列: 2. 多维: 3. 稀疏: 数据存储: 数据访问: HBase 的数据模型…

炼丹学习笔记2---ubuntu2004运行3D Gaussian Splatting记录

前言 主要想看看前沿效果&#xff0c;看看跟激光slam出来效果差多少。折腾过程中&#xff0c;务必 根据本地的cuda版本号&#xff0c;安装对应的torch相关东西。 1、拉仓库 git clone https://github.com/graphdeco-inria/gaussian-splatting.git2、创建环境并激活 conda c…

MySQL详细安装、配置过程,多图,详解

本文适合centos7环境下安装mysql&#xff0c;在安装和卸载过程中&#xff0c;都在root用户下完成。文章目录 清理环境获取mysql官方yum源安装mysql yum源安装mysql服务安装报错解决办法验证是否安装完成启动mysql服务登录服务方法一&#xff1a;方法二&#xff1a;方法三&#…

数据意外删除?安卓手机数据恢复教程来帮你解救

手机不仅仅是一个通讯工具&#xff0c;更是我们记录生活、工作、学习等各种信息的重要载体&#xff0c;无论是拍照、录音、录像&#xff0c;还是文字记录&#xff0c;手机都能轻松完成。可有时候我们会不小心删除一些重要的数据&#xff0c;这时候我们该怎么办呢&#xff1f;别…

Modbus-RTU/TCP规约 | 报文解析 | 组织报文与解析报文(C++)

文章目录 一、MODBUS规约1.MODBUS-RTU规约2.MODBUS-TCP规约 二、报文解析1.MODBUS-RTU报文帧解析2.MODBUS-TCP报文帧解析 三、C代码实现组织报文与解析报文 一、MODBUS规约 Modbus规约是一种广泛使用的串行通信协议&#xff08;应用层报文传输协议&#xff09;&#xff0c;用于…

鲲泰新闻丨第七届数字中国建设峰会正式启幕,神州鲲泰携手天翼云共筑智算云生态

2024年5月23日&#xff0c;由国家发展改革委、国家数据局、国家网信办、科技部、国务院国资委、福建省人民政府共同主办的“第七届数字中国建设峰会”在福建省福州市海峡国际会展中心盛大开幕。 数字中国建设峰会是展示数字中国建设成就的盛会&#xff0c;本次峰会以“释放数据…

【MYSQL】分数排名

表: Scores ---------------------- | Column Name | Type | ---------------------- | id | int | | score | decimal | ---------------------- id 是该表的主键&#xff08;有不同值的列&#xff09;。 该表的每一行都包含了一场比赛的分数。Score 是…

草图大师2024怎么保存低版本呢?插件怎么写?

草图大师是一款流行的绘图和设计软件&#xff0c;为了向后兼容&#xff0c;保存低版本文件时&#xff0c;可以采取以下步骤&#xff1a; su模型库 1.另存为旧版本格式&#xff1a; 在保存文件时&#xff0c;草图大师通常会提供一个选项&#xff0c;让你选择要保存的文件格式和…

智简云携手云器Lakehouse打造一体化大数据平台,释放数据价值

导读 本篇分享的是智简云使用云器Lakehouse升级数据平台的实践总结。 智简云&#xff0c;是一家拥有十余年历史的科技公司&#xff0c;专注于企业服务领域&#xff0c;开发了两款核心产品&#xff1a;基于PASS平台的客户关系管理&#xff08;CRM&#xff09;系统和为中小型用…

Go微服务——go-micro v4安装使用

安装go-micro 打开cmd窗口&#xff0c;执行以下命令 go install github.com/go-micro/cli/cmd/go-microlatest测试是否成功安装 go-micro -v创建服务 go-micro new service helloworldwindows 安装make 安装地址 https://gnuwin32.sourceforge.net/packages/make.htm 配置…

springboot集成达梦数据库8,用springboot+mtbatisplus查询值为空

springboot集成达梦数据库8&#xff0c;用springbootmtbatisplus查询值为空 背景&#xff1a;springboot集成达梦数据库8&#xff0c;用springbootmtbatisplus查询值为空&#xff0c;但是在DB管理工具中是可以查询到数据的。 原因及解决方法&#xff1a;执行添加语句后&#xf…

《MySQL怎样运行的》—InnoDB数据页结构

在上一篇文章中我们讲了&#xff0c;InnoDB的数据页是InnoDB管理存储空间的基本单位&#xff0c;一个页的大小基本为16kb 那你有没有疑问&#xff0c;就是说这个InnoDB的数据页的结构是什么样的&#xff0c;还有他这些结构分别有那些功能~接下来我们一一讲解 数据页的总览结构…

Linux笔记之命令行JSON处理器jq

Linux笔记之命令行JSON处理器jq code review! 文章目录 Linux笔记之命令行JSON处理器jq1.安装2.jq 基本用法3.例程3.1. 示例JSON文件3.2. 读取特定字段3.3. 管道过滤器&#xff08;Pipe Filters&#xff09;3.4. 映射过滤器&#xff08;Map Filters&#xff09;3.5. 条件过滤…

短视频都是怎么剪的:四川京之华锦信息技术公司

短视频都是怎么剪的 随着移动互联网的迅猛发展&#xff0c;短视频已成为人们日常生活中不可或缺的一部分。无论是记录生活的点滴&#xff0c;还是展示个人才艺&#xff0c;短视频都以其短小精悍、直观生动的特点&#xff0c;吸引了众多用户的关注。四川京之华锦信息技术公司那…

自动化重置数据库功能的探索与实践

1、简介 在现代软件开发中&#xff0c;尤其是涉及到数据驱动的应用程序时&#xff0c;开发和测试环境中数据库的管理是至关重要的一环。为了确保开发和测试环境中的数据库始终处于一致的状态&#xff0c;自动化重置数据库成为了一种常见的实践。本文旨在介绍如何通过Shell脚本…

内网(极空间)搭建gitlab跳板机转发端口及域名配置

背景说明 https://blog.csdn.net/GodDavide/article/details/139182475 上文说到: 我已经用docker搭好了gitlab-ce服务&#xff0c;但我是部署在自己的家庭nas-极空间z4pro里的&#xff0c;属于内网环境。 另外我有一台阿里云服务器&#xff0c;做跳板机。 我有一个阿里的域名…

老Java学 Go 笔录(二) 从 go 的编译开始学起

目录 一.版本选择二.环境准备三.工具的选择四.第一个 hello go4.1 开发4.2 编译4.3 编译运行4.4 直接安装 五.用 go 快速搭建 webserver六.调用外部三方方法七.go vs java 的执行 前言 专栏旨在利用现有的 java 体系内容去完成 go 语言的学习. 本次行文是在 https://go.dev/doc…