C++系列二:数据类型

news2024/11/24 23:02:43

C++数据类型

    • 1. 原始类型
    • 2. 复合类型
    • 3. 类型转换
      • 3.1 隐式类型转换
      • 3.2 显式类型转换
    • 4. 总结(手稿版)

1. 原始类型

C++ 中的原始类型包括整型(integral types)浮点型(floating-point types)字符型(character types)布尔型(boolean types)以及空指针类型(nullptr_t)

(1)整型

整型是 C++ 中最基本的类型之一,可以分为带符号(signed)和无符号(unsigned)两种类型。主要的整型类型包括:

char:1 字节,用于存储字符或者小整数,带符号类型。
short:2 字节,用于存储比 char 大但比 int 小的整数,带符号类型。
int:通常为 4 字节,用于存储正负整数,带符号类型。
long:通常为 8 字节,用于存储比 int 大的整数,带符号类型。
long long:通常为 8 字节,用于存储更大的整数,带符号类型。

以上整型类型还可以加上 unsigned 修饰符,表示无符号类型。

(2)浮点型

浮点型用于存储实数。主要的浮点型类型包括:

float:4 字节,单精度浮点数。
double:8 字节,双精度浮点数。
long double:通常为 16 字节,更高精度的浮点数。

(3)字符型

字符型用于存储字符。C++ 中的字符型有两种类型:

char:1 字节,用于存储 ASCII 码或者扩展 ASCII 码字符。
wchar_t:2 或 4 字节(根据编译器而定),用于存储 Unicode 字符。

(4)布尔型

布尔型用于存储真(true)假(false)值,布尔型只占用一个字节的空间。

(5)空指针类型

空指针类型是 C++11 新增的类型,用于表示空指针,只有一个取值,即 nullptr

2. 复合类型

C++ 中复合类型是由原始类型定义的,包括:指针、数组、结构体和联合等。

(1)指针

指针是一个变量,其值为另一个变量的地址。指针可以指向任何数据类型(包括原始类型和复合类型)。在 C++ 中,我们使用 * 运算符来声明指向某一类型的指针。如:

int var = 10;
int *ptr;
ptr = &var;

上述代码,ptr 是一个指向 int 类型变量 var 的指针。

(2)数组

数组是一种存储相同数据类型元素的集合。C++ 中使用 [] 运算符来定义数组。例如:

int arr[5] = {1, 2, 3, 4, 5};

上述代码定义了一个由 5 个 int 类型元素组成的数组,可以通过下标来访问数组元素。例如:arr[0] 表示数组的第一个元素。

(3)结构体

结构体是一种自定义的数据类型,可由多个不同类型的数据成员组成。在 C++ 中,使用 struct 关键字来定义结构体。例如:

struct Person {
    char name[20];
    int age;
    float height;
};

上述代码定义了一个名为 Person 的结构体,其包含三个数据成员:name、age 和 height。我们可以通过 . 运算符来访问结构体的数据成员。例如:

Person p;
strcpy(p.name, "张三");
p.age = 18;
p.height = 1.75;

上述代码创建了一个 Person 类型的变量 p,并设置了它的 name、age 和 height 数据成员。

(4)联合

联合是一种特殊的结构体,它的所有数据成员共享同一块内存空间, C++ 中使用 union 关键字来定义联合。例如:

union Number {
    int i;
    float f;
};

上述代码定义了一个名为 Number 的联合,其包含两个数据成员:i 和 f。i 和 f 共享同一块内存空间。我们可以通过 . 运算符来访问联合的数据成员。例如:

Number n;
n.i = 10;
cout << n.f << endl; // 输出 2.31584e-41
n.f = 3.14;
cout << n.i << endl; // 输出 1078523331

上述代码创建了一个 Number 类型的变量 n,并设置了它的 i 和 f 数据成员。由于 i 和 f 共享同一块内存空间,因此改变其中一个数据成员的值会影响另一个数据成员的值。

(5)枚举类型

枚举类型是一种自定义的数据类型,用于表示某些有限的离散值,C++ 中使用 enum 关键字来定义枚举类型。例如:

enum Color {
    RED,
    GREEN,
    BLUE
};

上述代码定义了一个名为 Color 的枚举类型,其包含三个值:RED、GREEN 和 BLUE。枚举类型的值默认从 0 开始自增。可使用枚举值来定义变量。例如:

Color c = BLUE;

上述代码定义了一个名为 c 的 Color 类型的变量,并将其设置为 BLUE。

3. 类型转换

3.1 隐式类型转换

(1)整型提升

在表达式运算中,较小的整型类型(如 charshort)会被自动转换为更大的整型类型(如 intlong)。例如:

char c = 'A';
int i = c + 10;

上述代码字符变量 c 被提升为 int 类型,以便与整数常量 10 相加。

(2)浮点型提升

当一个浮点数参与运算时,如果其它操作数不是浮点数,则其它操作数将被转换为浮点数。例如:

float f = 3.14;
double d = f + 1.0;

上述代码单精度浮点数 f 被隐式转换为双精度浮点数,以便与双精度浮点数常量 1.0 相加。

(3)向下转换

当一种数据类型的取值范围小于另一种数据类型时,较大的数据类型可以被自动转换为较小的数据类型。这种转换称为向下转换,通常需要显式地告诉编译器进行该操作。例如:

int i = 10;
char c = i;

上述代码整数变量 i 被强制转换为 char 类型,并且只保留了低 8 位。

3.2 显式类型转换

C++ 中提供了四种显式类型转换方式:static_castdynamic_castreinterpret_castconst_cast

(1)static_cast

static_cast 可以用于基本数据类型之间的转换,例如:

int i = 10;
float f = static_cast<float>(i);

上述代码将整型变量 i 转换为浮点型变量 f。

static_cast 还可以用于指针之间的转换,例如:

int *ptr = new int(10);
void *vp = static_cast<void*>(ptr);

上述代码将 int 类型指针 ptr 转换为 void* 类型指针 vp。

(2)dynamic_cast

dynamic_cast 主要用于类层次结构中,用于安全地将基类指针转换为派生类指针,或将派生类指针转换为基类指针。例如:

class Base {...};
class Derived : public Base {...};

Base *bp = new Derived;
Derived *dp = dynamic_cast<Derived*>(bp);

上述代码中,基类指针 bp 被转换为派生类指针 dp。

(3)reinterpret_cast

reinterpret_cast 可以将一种指针类型转换为另一种指针类型,或者将整数类型转换为指针类型。使用该方式进行转换时需要特别小心,因为它可以忽略类型之间的任何差异和安全检查。例如:

int i = 10;
char *cp = reinterpret_cast<char*>(&i);

上述代码将整型变量 i 的地址强制转换为 char* 类型指针。

(4)const_cast

const_cast 主要用于去除对象的常量性。例如:

const int ci = 10;
int *ip = const_cast<int*>(&ci);
*ip = 20;   // 此操作会导致未定义行为

上述代码中,常量对象 ci 被强制转换为非常量对象,并且该操作可能会导致未定义行为。

4. 总结(手稿版)

20年前学习C++语言的幼稚记录
在这里插入图片描述

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

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

相关文章

涨薪60%,从小厂逆袭,坐上美团技术专家(面经+心得)

前言 大多数情况下&#xff0c;程序员的个人技能成长速度&#xff0c;远远大于公司规模或业务的成长速度。所以&#xff0c;跳槽成为了这个行业里最常见的一个词汇。 实际上&#xff0c;跳槽的目的无非是为了涨薪或是职业发展&#xff0c;我也不例外。普通本科毕业后&#xf…

计算机网络基础知识(一)计算机发展史、网络设备、网络结构及拓扑

文章目录 01 | 网络设备02 | 网络结构 && 拓扑 网络发展史可以追溯到20世纪60年代&#xff0c;当时美国国防部高级研究计划署&#xff08;ARPA&#xff09;启动了一个名为 ARPANET 的项目&#xff0c;旨在建立军事目的的分布式通信网络&#xff0c;使得网络中的任何一台…

【redis】redis红锁Redlock算法和底层源码分析

【redis】redis红锁Redlock算法和底层源码分析 文章目录 【redis】redis红锁Redlock算法和底层源码分析前言一、当前代码为8.0版&#xff0c;接上一步分布式锁的主要考点lock加锁关键逻辑unlock解锁关键逻辑 二、redis分布式锁-Redlock红锁主页说明:目前所写的分布式锁还有什么…

c++自学笔记(陆续更新)

本笔记为从菜鸟教程边学边记录的笔记---》C 教程 | 菜鸟教程 面向对象程序设计 封装&#xff08;Encapsulation&#xff09;&#xff1a;封装是将数据和方法组合在一起&#xff0c;对外部隐藏实现细节&#xff0c;只公开对外提供的接口。这样可以提高安全性、可靠性和灵活性。…

C语言入门教程||C语言 头文件||C语言 强制类型转换

C语言 头文件 头文件是扩展名为 .h 的文件&#xff0c;包含了 C 函数声明和宏定义&#xff0c;被多个源文件中引用共享。有两种类型的头文件&#xff1a;程序员编写的头文件和编译器自带的头文件。 在程序中要使用头文件&#xff0c;需要使用 C 预处理指令 #include 来引用它…

USART串口接收

文章目录 运行环境&#xff1a;1.1 串口接收代码分析1)开启接收中断和空闲中断2)接收存储变量声明和定义3)中断处理函数 2.1实验效果 运行环境&#xff1a; ubuntu18.04.melodic 宏基暗影骑士笔记本 stm32f427IIH6 stlink 9-24v可调电源 usb转串口 杜邦线转4pin 1.1 串口接收…

Python | 人脸识别+活体检测+背景模糊+关键点检测系统(Face_Recognition+dlib+OpenCV+MediaPipe+PyQt)

本博客为人脸识别系统项目简介 项目GitHub完整源代码地址&#xff1a; 一、运行环境 本系统能够运行在基于PC操作系统Windows环境下&#xff0c;要求Windows操作系统安装Python 3.9 及以上环境&#xff0c;且已安装MySQL数据库。 Python3.9 安装&#xff1a;Python 3.9安装教程…

【UE】坦克开火

1. 添加开火的操作映射 2. 创建一个actor蓝图类&#xff0c;添加一个静态网格体组件 添加发射物移动组件 设置初始速度和最大速度 发射物重力范围设为0.05 添加音频组件 设置音效 3. 打开炮管的静态网格体 在插槽管理器中创建插槽 将创建的插槽放到炮口位置 4. 打开“BP_BaseT…

B-Tree (多路查找树)分析-20230503

B-Tree (多路查找树)学习-20230503 前言 B-树是一类多路查询树&#xff0c;它主要用于文件系统和某些数据库的索引&#xff0c;如果采用二叉平衡树访问文件里面的数据&#xff0c;最坏情况下&#xff0c;磁头可能需要进行O(h)次对磁盘的读写&#xff0c;其中h为树的高度&…

探究Android插件化开发的新思路——Shadow插件化框架

Shadow插件化框架是什么&#xff1f; Shadow是一种Android App的插件化框架&#xff0c;它利用类似于ClassLoader的机制来实现应用程序中的模块化&#xff0c;并让这些模块可以在运行时灵活地进行加载和卸载。Shadow框架主张将一个大型的Android App拆分成多个小模块&#xff…

提升V-Ray渲染效率的五个实用技巧!

Chaos V-Ray是一个 3D渲染插件&#xff0c;可用于所有主要的 3D设计和 CAD程序。V-Ray可以和 3ds Max、Cinema 4D、Houdini、Maya、Nuke、Revit、Rhino、SketchUp和 Unreal无缝协作。艺术家和设计师也可以通过使用 V-Ray的实时光线来追踪探索和分享自己的项目&#xff0c;并渲染…

SpringBoot调取OpenAi接口实现ChatGpt功能

很高兴和大家分享我实现的一个小项目&#xff0c;利用 Spring Boot 实现了一个 ChatGpt 对话系统。在本文中&#xff0c;我将详细介绍这个项目的实现步骤&#xff0c;以及代码实现。 什么是 ChatGpt ChatGpt 是一种基于 GPT 技术的对话系统&#xff0c;能够生成连贯、流畅、…

V-Ray怎么快速渲染_渲染加速小技巧

很多小伙伴在使用V-Ray渲染器的时候都想要更加快速的出图&#xff0c;今天Renderbus瑞云渲染就给大家分享一下V-Ray渲染加速的小技巧。 在了解渲染加速技巧之前&#xff0c;我们首先要了解渲染制作主要受两个因素影响——图像质量和渲染时间&#xff0c;高图像质量是以长渲染时…

k8s集群搭建(3主2从)

目录 kubeadm 和二进制安装 k8s 适用场景分析 多 master 节点高可用架构图 集群环境准备 部署过程 修改主机内核参数&#xff08;所有节点&#xff09; 配置阿里云的repo源&#xff08;所有节点&#xff09; 配置国内安装 docker 和 containerd 的阿里云的 repo 源 配置…

day11 TCP连接管理与UDP协议

目录 ​编辑 连接的建立——”三次握手” 连接的释放——“四次挥手” 保活计时器 用户数据报协议 UDP​编辑 连接的建立——”三次握手” TCP 建立连接的过程叫做握手。 采用三报文握手&#xff1a;在客户和服务器之间交换三个 TCP 报文段&#xff0c;以防止已失效的连接…

SPSS如何进行多重响应分析之案例实训?

文章目录 0.引言1.多重响应变量频率分析2.对多重响应变量集进行交叉表分析3.使用表过程研究多重响应变量集 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对SPSS进行了学习&#xff0c;本文通过《SPSS统计分析从入门到精通》及其配套素材结合网上相关资料进行学习笔记…

对模式的迷信,大部分是幻觉和妄想

对模式的迷信&#xff0c;大部分是幻觉和妄想 往往有严重的投机心理 郑翔洲&#xff0c;所谓模式设计专家 还是有点虚&#xff0c;仅供一点参考 说苹果、说华为、说小米这些总结都是事后诸葛亮 趣讲大白话&#xff1a;商业模式被妖魔化 【趣讲信息科技153期】 ****************…

从零构建等保三级|安全狗一站式等保解决方案助用户快速过等保

一 政策法规下的等级保护 “没有网络安全就没有国家安全&#xff0c;没有信息化就没有现代化。” 在2017年6月1日&#xff0c;我国开始全面实行《网络安全法》&#xff0c;其中第二十一条规定了“国家实行网络安全等级保护制度”。此外&#xff0c;在2019年5月13日&#xff…

数据开发常见问题

目录 环境变量过多或者参数值过长时&#xff0c;为什么提交作业失败&#xff1f; 为什么Shell作业状态和相关的YARN Application状态不一致&#xff1f; 创建作业和执行计划的区别是什么&#xff1f; 如何查看作业运行记录&#xff1f; 如何在OSS上查看日志&#xff1f; 读…

阿里云服务器vCPU和CPU有什么区别?

阿里云服务器vCPU和CPU是什么意思&#xff1f;CPU和vCPU有什么区别&#xff1f;一台云服务器ECS实例的CPU选项由CPU物理核心数和每核线程数决定&#xff0c;CPU是中央处理器&#xff0c;一个CPU可以包含若干个物理核&#xff0c;通过超线程HT&#xff08;Hyper-Threading&#…