深入理解 C++ 数据类型:从基础到高级应用

C++ 是一种强类型语言,这意味着每个变量都必须有明确的数据类型,以便编译器知道如何存储和操作数据。数据类型决定了变量的内存占用、取值范围以及可以执行的操作。理解 C++ 的数据类型是编写高效、安全代码的基础。本文将全面介绍 C++ 的数据类型,包括基本数据类型、派生类型、用户自定义类型,以及 C++11/14/17 引入的新特性,帮助读者掌握数据类型的核心概念和应用场景。

1. 基本数据类型(Primitive Types)

基本数据类型是 C++ 内置的最基础的数据类型,包括整型、浮点型、字符型和布尔型。

1.1 整型(Integer Types)

整型用于存储整数,C++ 提供了不同大小的整型以适应不同的需求:

类型大小(字节)取值范围(32/64 位系统)
short2-32,768 到 32,767
int4-2,147,483,648 到 2,147,483,647
long4 或 8取决于平台
long long8-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
unsigned 变体同尺寸仅非负数(范围更大)

示例:

short age = 25;          // 短整型
int salary = 50000;      // 标准整型
long population = 8000000000L;  // 长整型
long long bigNum = 9'223'372'036'854'775'807LL;  // 长长整型(C++14 支持数字分隔符)

1.2 浮点型(Floating-Point Types)

浮点型用于存储小数,C++ 提供三种浮点类型:

类型大小(字节)有效数字位数典型范围
float46-7±3.4e-38 到 ±3.4e38
double815-16±1.7e-308 到 ±1.7e308
long double1618-19更大范围

示例:

float pi = 3.14159f;     // 单精度浮点(加 'f' 后缀)
double distance = 1.496e11;  // 双精度浮点(科学计数法)
long double preciseValue = 3.141592653589793238L;  // 扩展精度

1.3 字符型(Character Types)

字符型用于存储单个字符或 Unicode 字符:

类型大小(字节)用途
char1ASCII 字符(如 'A'
wchar_t2 或 4宽字符(如 UTF-16)
char16_t2UTF-16 编码(C++11)
char32_t4UTF-32 编码(C++11)

示例:

char letter = 'A';
wchar_t wideChar = L'你';  // 宽字符(L 前缀)
char16_t utf16Char = u'😊'; // UTF-16
char32_t utf32Char = U'🚀'; // UTF-32

1.4 布尔型(Boolean Type)

bool 类型仅有两个值:true(1)和 false(0),常用于逻辑判断。

示例:

bool isRaining = true;
bool isSunny = false;
if (isRaining) {cout << "Take an umbrella!" << endl;
}

2. 派生数据类型(Derived Types)

派生数据类型由基本类型组合或扩展而来,包括数组、指针、引用和函数。

2.1 数组(Array)

数组是相同类型元素的集合,大小固定。

示例:

int numbers[5] = {1, 2, 3, 4, 5};  // 静态数组
for (int i = 0; i < 5; i++) {cout << numbers[i] << " ";
}

2.2 指针(Pointer)

指针存储变量的内存地址,可用于动态内存管理。

示例:

int x = 10;
int* ptr = &x;  // ptr 存储 x 的地址
cout << *ptr;   // 输出 10(解引用)

2.3 引用(Reference)

引用是变量的别名,必须在声明时初始化。

示例:

int y = 20;
int& ref = y;  // ref 是 y 的引用
ref = 30;      // 修改 y 的值
cout << y;     // 输出 30

2.4 函数(Function)

函数也是一种数据类型,可以定义函数指针或 Lambda 表达式。

示例:

int add(int a, int b) { return a + b; }
int (*funcPtr)(int, int) = add;  // 函数指针
cout << funcPtr(2, 3);  // 输出 5

3. 用户自定义类型(User-Defined Types)

C++ 允许用户定义自己的数据类型,如结构体、类、枚举和联合体。

3.1 结构体(struct

结构体用于组合不同类型的数据。

示例:

struct Person {string name;int age;
};
Person p = {"Alice", 25};
cout << p.name;  // 输出 "Alice"

3.2 类(class

类是面向对象编程的核心,支持封装、继承和多态。

示例:

class Rectangle {
private:int width, height;
public:Rectangle(int w, int h) : width(w), height(h) {}int area() { return width * height; }
};
Rectangle rect(10, 20);
cout << rect.area();  // 输出 200

3.3 枚举(enum

枚举用于定义一组命名的常量。

示例:

enum Color { RED, GREEN, BLUE };
Color c = GREEN;
if (c == GREEN) {cout << "Go!" << endl;
}

3.4 联合体(union

联合体允许同一内存存储不同类型的数据(但只能同时存一个)。

示例:

union Data {int i;float f;
};
Data d;
d.i = 42;  // 此时 d.f 的值未定义

4. C++11/14/17 新增类型

现代 C++ 引入了更强大的类型系统:

4.1 auto 自动类型推导

auto x = 42;      // x 是 int
auto name = "Bob"; // name 是 const char*

4.2 decltype 获取表达式类型

int a = 10;
decltype(a) b = 20;  // b 的类型与 a 相同(int)

4.3 nullptr(替代 NULL

std::byte buffer[1024];  // 用于二进制数据处理

4.4 std::byte(C++17)

表示原始字节数据:

std::byte buffer[1024];  // 用于二进制数据处理

5. 其他

5.1 类型别名

别名描述示例
typedef为现有类型定义别名typedef int MyInt;
using为现有类型定义别名(C++11 引入)using MyInt = int;

5.2 标准库类型

数据类型描述示例
std::string字符串类型std::string s = "Hello";
std::vector动态数组std::vector<int> v = {1, 2, 3};
std::array固定大小数组(C++11 引入)std::array<int, 3> a = {1, 2, 3};
std::pair存储两个值的容器std::pair<int, float> p(1, 2.0);
std::map键值对容器std::map<int, std::string> m;
std::set唯一值集合std::set<int> s = {1, 2, 3};

5.3 typedef 声明

您可以使用 typedef 为一个已有的类型取一个新的名字。下面是使用 typedef 定义一个新类型的语法:

typedef type newname; 

例如,下面的语句会告诉编译器,feet 是 int 的另一个名称:

typedef int feet;

现在,下面的声明是完全合法的,它创建了一个整型变量 distance:

feet distance;

总结

C++ 提供了丰富的数据类型,从基本类型到高级自定义类型,每种类型都有其适用场景。理解这些类型的特点和用法,有助于编写高效、可维护的代码。

类别关键点
基本数据类型intfloatcharbool
派生数据类型数组、指针、引用、函数
用户自定义类型structclassenumunion
现代 C++ 类型autodecltypenullptrstd::byte

掌握这些数据类型后,你可以更灵活地设计程序,并优化内存和性能。希望本文能帮助你深入理解 C++ 的数据类型系统!

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

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

相关文章

补题:K - Magic Tree (Gym - 105231K)

来源&#xff1a;问题 - K - Codeforceshttps://codeforces.com/gym/105231/problem/K 题目描述&#xff1a; 一、题目分析 本题给定一个2行m列的网格&#xff0c;从(1, 1)格子开始进行深度优先搜索&#xff0c;每个格子可到达至少一个边相邻的格子且不重复访问&#xff0c;…

【Prometheus-OracleDB Exporter安装配置指南,开机自启】

目录 1. 安装Oracle Instant Client1.1 解压安装包1.2 创建运行时链接 2. 环境配置2.1 设置环境变量2.2 验证配置 3. 安装Oracle DB Exporter3.1 创建工作目录3.2 解压安装包3.3 添加执行权限 4. 数据库监控配置4.1 创建监控用户&#xff08;切换到Oracle所属用户&#xff09; …

溯因推理思维——AI与思维模型【92】

一、定义 溯因推理思维模型是一种从结果出发,通过分析、推测和验证,寻找导致该结果的可能原因的思维方式。它试图在已知的现象或结果基础上,逆向追溯可能的原因,构建合理的解释框架,以理解事物的本质和内在机制。 二、由来 溯因推理的思想可以追溯到古希腊哲学家亚里士…

Git 基本操作(二)

目录 撤销修改操作 情况一 情况二 情况三 删除文件 升级git 撤销修改操作 在日常编码过程中&#xff0c;有些时候&#xff0c;我们可能写着写着发现目前的版本的代码越写越挫&#xff0c;越不符合标准&#xff0c;想让我们当前的文件去恢复到上一次提交的版本…

java使用CMU sphinx语音识别

java使用CMU sphinx语音识别 一、pom依赖1、依赖dependency2、配置仓库repository 二、下载中文资源包1、下载中文资源包&#xff08;需要其他语言的选择对应的文件夹即可&#xff09;&#xff0c;中文选择Mandarin2、将下载后的文件放到项目中3、代码-识别wav语音文件4、代码-…

企业内训|智能驾驶与智能座舱技术——某汽车厂商

4月25日&#xff0c;东北某市&#xff0c;TsingtaoAI团队为某汽车厂商的智能驾驶业务和研发团队交付“智能驾驶与智能座舱技术”课程。本课程系统讲解智能汽车两大核心领域技术架构与实现路径。课程涵盖智能驾驶感知层&#xff08;激光雷达/毫米波雷达/视觉融合&#xff09;、决…

【数学建模国奖速成系列】优秀论文绘图复现代码(二)

文章目录 国奖论文绘图复现代码&#xff0c;可直接运行柱状图横向柱状图分组柱状图堆叠柱状图堆叠柱状图2三维柱状图完整复现代码 国奖论文绘图复现代码&#xff0c;可直接运行 数模比赛的绘图是非常重要得&#xff0c;这篇文章给大家分享我自己复现的国奖优秀论文的代码&…

GitLab CVE-2024-12444 安全漏洞解决方案

本文分享极狐GitLab 补丁版本 17.11.1, 17.10.5, 17.9.7 的详细内容。这几个版本包含重要的缺陷和安全修复代码&#xff0c;我们强烈建议所有私有化部署用户应该立即升级到上述的某一个版本。对于极狐GitLab SaaS&#xff0c;技术团队已经进行了升级&#xff0c;无需用户采取任…

随机微分方程(SDE):股票价格模型、利率模型的构建

随机微分方程&#xff08;SDE&#xff09;&#xff1a;股票价格模型、利率模型的构建 一、随机微分方程&#xff08;SDE&#xff09;基础&#xff1a;从确定性到随机性的扩展 1. 定义与一般形式 随机微分方程&#xff08;SDE&#xff09;是包含布朗运动&#xff08;随机项&am…

【MCP Node.js SDK 全栈进阶指南】高级篇(1):MCP多服务器协作架构

随着业务规模的不断扩大和系统复杂度的提升,单一服务器架构往往无法满足高并发、高可用性和弹性扩展的需求。在MCP生态系统中,多服务器协作架构成为构建大规模应用的必然选择。本文将深入探讨MCP TypeScript-SDK在多服务器环境下的部署、协作和管理,以及如何构建高可用、高性…

git 修改用户名和邮箱

在 Git 中修改用户名和邮箱地址是常见的任务&#xff0c;这可以确保你的提交记录使用正确的身份信息。你可以通过简单的命令来完成这一操作。 全局配置 修改全局用户名 要修改全局的用户名&#xff0c;请执行以下命令&#xff1a; git config --global user.name "New…

[算法学习]——通过RMQ与dfs序实现O(1)求LCA(含封装板子)

每周五篇博客&#xff1a;&#xff08;3/5&#xff09; 碎碎念 其实不是我想多水一篇博客&#xff0c;本来这篇是欧拉序的博客&#xff0c;结果dfs序也是可以O1求lca的&#xff0c;而且常数更优&#xff0c;结果就变成这样了。。。 前置知识 [算法学习]——dfs序 思想 分…

spark local模式

Spark Local 模式是一种在单台机器上运行 Spark 应用程序的模式&#xff0c;无需搭建分布式集群&#xff0c;适合开发调试、学习以及运行小规模数据处理任务。以下为你详细介绍该模式&#xff1a; 特点 简易性&#xff1a;无需额外配置分布式集群&#xff0c;在单机上就能快速…

用 RxSwift 实现 UITableView 的响应式绑定(超实用示例)

目录 前言 一、环境准备 1.安装 RxSwift 和 RxCocoa 2.导入模块 二、实现一个简单的UITableView 1.实现一个简单的 UITableView 1.实现步骤 1.我们声明一个ViewModel 2.ViewModel和UITableView 绑定 2.实现 UITableView 的代理方法 三、处理点击事件 前言 在 iOS 开发…

【C++】通过红黑树封装map和set

前言&#xff1a; 通过之前的学习&#xff0c;我们已经学会了红黑树和map、set。这次我们要实现自己的map和set&#xff0c;对&#xff0c;使用红黑树进行封装&#xff01; 当然&#xff0c;红黑树内容这里就不在赘述&#xff0c;我们会复用红黑树的代码&#xff0c;所以先将…

非凸科技受邀出席AI SPARK活动,共探生成式AI驱动金融新生态

4月19日&#xff0c;由AI SPARK社区主办的“生成式AI创新与应用构建”主题沙龙在北京举行。活动聚焦生成式AI的技术突破与产业融合&#xff0c;围绕大模型优化、多模态应用、存内计算等前沿议题展开深度探讨。非凸科技受邀出席并发表主题演讲&#xff0c;深入解析金融垂直大模型…

【Java IO流】IO流详解

参考笔记&#xff1a;【Java基础-3】吃透Java IO&#xff1a;字节流、字符流、缓冲流_javaio-CSDN博客 目录 1.IO流简介 1.1 什么是IO流&#xff1f; 1.2 IO流的分类 1.3 字符流和字节流的其他区别 1.4 Java IO流体系图 2.字符编码详解 3. Java的char类型与 Unicode、U…

驱动开发系列56 - Linux Graphics QXL显卡驱动代码分析(三)显示模式设置

一:概述 如之前介绍,在qxl_pci_probe 中会调用 qxl_modeset_init 来初始化屏幕分辨率和刷新率,本文详细看下 qxl_modeset_init 的实现过程。即QXL设备的显示模式设置,是如何配置CRTC,Encoder,Connector 的以及创建和更新帧缓冲区的。 二:qxl_modeset_init 分析 in…

Vue3开发常见性能问题知多少

文章目录 1 常见性能优化瓶颈及原因1.1 响应式数据的过度使用1.2 虚拟 DOM 的频繁更新1.3 组件渲染的冗余1.4 大列表渲染的性能问题1.5 计算属性和侦听器的滥用1.6 事件处理函数的频繁绑定1.7 异步组件的加载性能2 解决方案与优化技巧2.1 合理使用响应式数据2.2 优化虚拟 DOM 更…

Rust Ubuntu下编译生成环境win程序踩坑指南

前言&#xff1a; 1&#xff0c;公司要给一线搞一个升级程序&#xff0c;需要在win下跑。 之前都是找开发总监帮忙&#xff0c;但是他最近比较忙。就让我自己搞。有了下文.。说来惭愧&#xff0c;之前写过一篇ubuntu下编译windows的文章。里面的demo就一句话 fuck world。依赖…