C++中变量与容器的默认初始化:0的奥秘
在C++编程的世界里,初始化是一个至关重要的概念。它决定了变量或容器在程序开始执行时的初始状态。然而,对于不同的数据类型和容器,C++标准对于默认初始化的行为有着不同的规定。本文将深入探讨C++中变量与容器的默认初始化规则,特别是关于它们是否会被初始化为0的奥秘。
一、基本数据类型的默认初始化
在C++中,基本数据类型(如int、float、double等)的默认初始化行为取决于它们的作用域和声明方式。
1.1 局部变量
对于在函数内部声明的局部变量,如果它们没有被显式初始化,那么它们的初始值是未定义的。这意味着它们可以包含任何值,这些值取决于它们在内存中的位置以及该内存区域在程序运行之前的状态。因此,不能假设这些局部变量会默认为0。
int a; // a的初始值是未定义的
为了避免未定义行为,建议在声明局部变量时立即进行初始化。
int a = 0; // a被初始化为0
1.2 全局变量和静态变量
与局部变量不同,全局变量(在函数外部声明的变量)和静态变量(使用static关键字声明的变量,无论是在函数内部还是外部)会被自动初始化为0(对于数值类型)或空指针(对于指针类型)。这是因为它们在程序的整个生命周期内都存在,且只被构造一次。
int b; // 对于全局变量或静态变量,b会被自动初始化为0
二、数组的默认初始化
在C++中,数组的默认初始化行为取决于它是全局数组、静态数组还是局部数组。
2.1 全局数组和静态数组
全局数组和静态数组会被自动初始化为0。这意味着数组的每个元素都会被设置为该元素类型的默认值。
int c[10]; // 对于全局数组或静态数组,c的每个元素都会被初始化为0
2.2 局部数组
然而,对于在函数内部声明的局部数组,如果它们没有被显式初始化,那么它们的元素初始值是未定义的。与局部变量一样,不能假设这些局部数组的元素会默认为0。
int d[10]; // d的每个元素的初始值是未定义的
为了确保局部数组的每个元素都被初始化为0,可以使用循环来逐个初始化它们。
for (int i = 0; i < 10; ++i) {d[i] = 0;
}
但请注意,在C++11及更高版本中,对于非常量大小的局部数组,不能使用花括号初始化来简写地将所有元素初始化为0。这是因为数组的大小必须是编译时常量才能使用花括号初始化。
三、std::vector的默认初始化
与原始C风格数组相比,std::vector
提供了更大的灵活性和安全性。特别是,当您使用 std::vector
声明一个向量并指定其大小时,该向量的每个元素都会被默认初始化为该元素类型的默认值。
int n = 10;
std::vector<int> e(n); // e是一个大小为10的整数向量,每个元素都被初始化为0
这是因为 std::vector
的构造函数会为其元素分配内存,并按照其元素类型的默认构造函数进行初始化。对于基本数据类型如 int
,默认构造函数实际上就是不做任何操作,但C++标准规定,在这种情况下,元素会被初始化为零。
四、其他容器的默认初始化
除了 std::vector
之外,C++标准库还提供了其他许多容器,如 std::array
、std::list
、std::map
等。这些容器的默认初始化行为各不相同,但通常都会遵循C++标准的初始化规则。
4.1 std::array
std::array
是一个固定大小的数组容器。与原始C风格数组不同,std::array
的元素在构造时会被默认初始化。
std::array<int, 10> f; // f是一个大小为10的整数数组容器,每个元素都被初始化为0
4.2 std::list 和 std::map
对于像 std::list
和 std::map
这样的容器,它们的元素是在插入时初始化的,而不是在构造容器时。因此,这些容器的默认构造函数不会初始化任何元素。但是,当您向这些容器插入元素时,新插入的元素会被默认初始化(对于基本数据类型,这通常意味着初始化为0)。
std::list<int> g; // g是一个空的整数列表容器
g.push_back(h); // 如果h是一个int类型的变量且未被初始化,则此行为是未定义的。正确做法是push_back一个已初始化的值,如g.push_back(0);
五、结论
在C++编程中,了解变量和容器的默认初始化行为是至关重要的。对于基本数据类型和原始C风格数组,未初始化的局部变量和数组元素可能包含任何值,这可能导致未定义行为。为了避免这种情况,建议在声明时立即进行初始化。
对于 std::vector
和其他标准库容器,它们的默认初始化行为通常更加安全和可预测。特别是,std::vector
在构造时会将其元素初始化为该元素类型的默认值(对于数值类型,这通常是0)。这使得 std::vector
成为处理动态大小数组时的首选容器。
总之,在C++编程中,始终建议初始化变量和容器的元素,以避免未定义行为和提高程序的健壮性。通过了解C++的默认初始化规则,并合理使用标准库容器,您可以编写出更加安全和高效的代码。
相关文章:
C++中变量与容器的默认初始化:0的奥秘
在C编程的世界里,初始化是一个至关重要的概念。它决定了变量或容器在程序开始执行时的初始状态。然而,对于不同的数据类型和容器,C标准对于默认初始化的行为有着不同的规定。本文将深入探讨C中变量与容器的默认初始化规则,特别是关…...
VScode内接入deepseek包过程(本地部署版包会)
目录 1. 首先得有vscode软件 2. 在我们的电脑本地已经部署了ollama,我将以qwen作为实验例子 3. 在vscode上的扩展商店下载continue 4. 下载完成后,依次点击添加模型 5. 在这里可以添加,各种各样的模型,选择我们的ollama 6. 选…...
spark
阶段性 阶段一: 单机时代 阶段二: 大数据时代-分布式处理 阶段三: 实时大数据时代 hadoop慢因为她的计算结果保存在磁盘 处理在spark中可解决属于内存 Hadoop特点: 高可靠性 高拓展性 高效性 高容错性...
蓝桥杯---排序数组(leetcode第912题)
文章目录 1.题目重述2.思路分析3.代码解释 1.题目重述 题目的要求是不使用库函数或者是其他的内置的函数(就是已经实现好的函数),也就是这个排序的逻辑需要我们自己进行实现; 2.思路分析 其实这个例子也是很容易理解的ÿ…...
【Javascript Day18】
目录 标签事件绑定的属性参数 阻止默认行为 dialog的实现及组织冒泡(捕获)传递 基于冒泡的事件委托 键盘事件的事件源对象信息 JS的自动触发操作 标签事件绑定的属性参数 <!-- 标签上的事件绑定,事件源对象通过 关键字event传递 --…...
轻量级C通用库Klib解读 —— kalloc
前言 Klib是一个独立的轻量级c通用库,里面大多数组件除了C标准库外不包含外部库,想用对应组件直接拷贝对应文件即可使用。 该库致力于高效和较小的内存占用,其中部分组件(如khash、kbtree、ksort、kvec),无…...
认识HTML的标签结构
一、HTML的基本概念 1.什么是HTML? ①HTML是描述网页的一种标记语言,也被称为超文本标记语言【并不是一种编程语言】 ②HTML包含了HTML标签和文本内容 ③HTML文档也称为web页面 2.HTML的标签 HTML的标签通常成对出现,HTML文档由标签和受…...
C语言 实现一个比较两个整型的函数 / qsort的使用 /qsort排序结构体
一、qsort的一般使用方法 int cmp_int(const void* e1, const void* e2) {return *(int*)e1 - *(int*)e2; } // //使用qsort对数组进行排序,升序 void test1() {int arr[] { 9,8,7,6,5,4,3,2,1,0 };int sz sizeof(arr) / sizeof(arr[0]);//bubble_sort(arr, sz);…...
Arcmap python环境安装sklearn
Arcmap自带的环境为Python2.7,默认安装目录为C:\Python27\ArcGIS10.7 直接安装sklearn会发生兼容性问题,且默认环境不包括pip,因此需要先安装pip 下载 get-pip.py 访问 https://bootstrap.pypa.io/pip/2.7/get-pip.py 并下载 get-pip.py。运…...
FastAdmin后端列表导入表格数据
后台添加数据的时候增加通过表格导入功能 如下图index.html页面增加导入和模板下载按钮代码如下 <div class"panel panel-default panel-intro">{:build_heading()}<div class"panel-body"><div id"myTabContent" class"ta…...
R语言用逻辑回归贝叶斯层次对本垒打数据与心脏移植数据后验预测检验模拟推断及先验影响分析|附数据代码...
全文链接:https://tecdat.cn/?p40152 在统计学领域中,层次建模是一种极为强大且实用的工具。它能够巧妙地处理复杂的数据结构,通过分层的方式对数据进行建模。在贝叶斯统计的框架内,层次建模优势尽显,其可以有效地融合…...
Python基于自然语言处理技术的新闻文本分类系统【附源码、文档说明】
博主介绍:✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…...
mybatis存储过程返回list
在MyBatis中调用存储过程并返回列表(List)通常涉及以下几个步骤: 定义存储过程:首先,在数据库中定义存储过程,并确保它返回结果集。配置MyBatis映射文件:在MyBatis的映射文件中配置调用存储过程…...
Unity项目实战-订阅者发布者模式
实战订阅者发布者模式详解 下面实例是一个射击类游戏,玩家可以切换枪支,最初的设计如下 public class Player:MonoBehaviour {//......省略代码逻辑//我们以及配置好了Scroll的输入,并配置了Scroll的输入事件,当玩家滚动鼠标滚轮…...
长文档处理痛点:GPT-4 Turbo引文提取优化策略与替代方案讨论
引言 随着GPT-4 Turbo的发布,其支持的128K上下文窗口(约300页文本)被视为处理长文本的突破性升级。然而,实际应用中,用户发现模型在提取长文档中的引文时存在显著缺陷:文档前三分之一的引文数量远多于中间…...
Deepseek 万能提问公式:高效获取精准答案
### **Deepseek 万能提问公式:高效获取精准答案** 在使用 Deepseek 或其他 AI 工具时,提问的质量直接决定了答案的精准度和实用性。以下是一个万能的提问公式回答: --- ### **1. 明确背景(Context)** - **作用**…...
Ubuntu中离线安装Docker
Ubuntu中离线安装Docker 前言 本教程将详细介绍如何在 Ubuntu 22.04 系统上,通过 .deb 包离线安装 Docker CE、Docker CE CLI 和 Docker Compose。 适用于无法访问互联网的环境。 准备工作 下载 .deb 包 在可以访问互联网的机器上,下载 Docker CE、…...
Linux配置SSH公钥认证与Jenkins远程登录进行自动发布
问题描述:在使用jenkins进行自动化部署时,其中一步是使用jenkins向目标服务器推送文件时,需要先在jenkins的系统配置中进行配置(事先安装好对应插件),配置远程服务器时,报错: 检查以…...
【故障处理】- 11g数据泵到19c导致的job不自动执行
【故障处理】- 11g数据泵到19c导致的job不自动执行 一、概述二、报错原因三、解决方法 一、概述 业务正常上线以后,客户反馈大量的job到时间了也不正常运行。 二、报错原因 该报错匹配bug 32249704,导致了迁移之后job的log_user从业务用户变成了sys。JOB…...
WPF8-常用控件
目录 写在前面:1. 按钮控件1.1. Button 按钮1.2. RepeatButton:长按按钮1.3. RadioButton:单选按钮 2. 数据显示控件2.1. TextBlock:只读文本控件2.2. Lable:标签 显示文本控件2.3. ListBox:显示可选择项的列表2.4. DataGrid&…...
电商小程序(源码+文档+部署+讲解)
引言 随着移动互联网的快速发展,电商小程序成为连接消费者与商家的重要桥梁。电商小程序通过数字化手段,为消费者提供了一个便捷、高效的购物平台,从而提升购物体验和满意度。 系统概述 电商小程序采用前后端分离的架构设计,服…...
关于C#的一些基础知识点汇总
1.C#结构体可以继承接口吗?会不会产生GC? 在 C# 中,结构体不能继承类,但可以实现接口。 代码: interface IMyInterface {void MyMethod(); }struct MyStruct : IMyInterface {public void MyMethod(){Console.Write…...
七、敏捷开发工具:持续集成与部署工具
一、敏捷开发工具——持续集成与部署工具 持续集成(CI)与持续部署(CD)是现代敏捷开发中不可或缺的关键实践。通过自动化构建、测试和部署流程,团队可以快速反馈、提高代码质量,并加速产品交付。为此,持续集成与部署工具应运而生,它们能够帮助开发团队在整个开发周期内…...
【工具类】 Hutool 中用于生成随机数的工具类
博主介绍:✌全网粉丝22W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
vue3和vue2的组件开发有什么区别
Vue3和Vue2在组件开发上存在不少差异,下面从多个方面详细介绍: 响应式原理 Vue2:用Object.defineProperty()方法来实现响应式。打个比方,它就像给对象的每个属性都安排了一个“小管家”,属性被访问或修改时࿰…...
防御保护选路练习
拓扑 配置 IP的基本配置 r2 [R2]int g0/0/0 [R2-GigabitEthernet0/0/0]ip add 12.0.0.2 255.255.255.0 [R2]int g0/0/2 [R2-GigabitEthernet0/0/2]ip add 210.1.1.254 255.255.255.0 [R2-GigabitEthernet0/0/2]int g0/0/1 [R2-GigabitEthernet0/0/1]ip add 200.1.1.254 255.…...
SQL Server 运算符优先级
在 SQL Server 中,运算符的优先级决定了在没有使用括号明确指定计算顺序时,运算符的执行顺序。 运算符优先级列表 括号 () 一元运算符 (正号)-(负号)~(按位取反) 乘法、除法和取模…...
【RK3588嵌入式图形编程】-SDL2-构建模块化UI
构建模块化UI 文章目录 构建模块化UI1、概述2、创建UI管理器3、嵌套组件4、继承5、多态子组件6、总结在本文中,将介绍如何使用C++和SDL创建一个灵活且可扩展的UI系统,重点关注组件层次结构和多态性。 1、概述 在前面的文章中,我们介绍了应用程序循环和事件循环,这为我们的…...
用STC-ISP写延时函数
若想写出自己可以定义时长的延时函数,需要重新生成一个1ms的延时函数并稍加修改。 STC-ISP生成的1ms的延时函数代码如下: void Delay1ms(void) //12.000MHz {unsigned char data i, j;i 2;j 239;do{while (--j);} while (--i); }将上述代码改为可自定…...
DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地
对于个人开发者或尝鲜者而言,本地想要部署 DeepSeek 有很多种方案,但是一旦涉及到企业级部署,则步骤将会繁琐很多。 比如我们的第一步就需要先根据实际业务场景评估出我们到底需要部署什么规格的模型,以及我们所要部署的模型&…...
使用 Docker 部署 Apache Spark 集群教程
简介 Apache Spark 是一个强大的统一分析引擎,用于大规模数据处理。本文将详细介绍如何使用 Docker 和 Docker Compose 快速部署一个包含一个 Master 节点和两个 Worker 节点的 Spark 集群。这种方法不仅简化了集群的搭建过程,还提供了资源隔离、易于扩…...
基于暗通道先验的图像去雾算法解析与实现
一、算法背景 何凯明团队于2009年提出的暗通道先验去雾算法《single image haze removal using dark channel prior》,通过统计发现:在无雾图像的局部区域中,至少存在一个颜色通道的像素值趋近于零。这一发现为图像去雾提供了重要的理论依据…...
深入内存调试:Valgrind工具的终极指南(转)
在软件开发的世界里,代码质量就是生命线,而内存管理又是这条生命线中最脆弱的一环。内存泄漏,哪怕只是微小的一处,日积月累,都可能对整个系统造成灾难性的打击,无论是大型企业级应用、实时性要求极高的嵌入…...
深入解析MediaPipe:强大的实时计算机视觉框架
深入解析MediaPipe:强大的实时计算机视觉框架 1. 引言 在计算机视觉应用的快速发展中,实时处理和低延迟成为了许多应用的关键需求。Google 开发的 MediaPipe 是一个强大的开源框架,它能够高效处理 手势识别、姿态估计、物体检测、语音处理 …...
DeepSeek 和 ChatGPT 在特定任务中的表现:逻辑推理与创意生成
🎁个人主页:我们的五年 🔍系列专栏:Linux网络编程 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 Linux网络编程笔记: https://blog.cs…...
大白话实战Sentinel
Sentinel是SpringCloudAlibaba提供的用来做服务保护的框架,而服务保护的常见手段就是限流和熔断降级。在大型分布式系统里面,由于微服务众多,所以服务之间的稳定性需要做特别关注,Sentinel的核心包就提供了从多个维度去保护服务稳定的策略,而且这些保护策略都可以连接上Se…...
【AI面板识别】
题目描述 AI识别到面板上有N(1 ≤ N ≤ 100)个指示灯,灯大小一样,任意两个之间无重叠。 由于AI识别误差,每次别到的指示灯位置可能有差异,以4个坐标值描述AI识别的指示灯的大小和位置(左上角x1,y1&#x…...
Docker安装Kafka(不依赖ZooKeeper)
创建docker-compose.yaml version: "3.9" #版本号 services:kafka:image: apache/kafka:3.9.0container_name: kafkahostname: kafkaports:- 9092:9092 # 容器内部之间使用的监听端口- 9094:9094 # 容器外部访问监听端口environment:KAFKA_NODE_ID: 1KAFKA_PROCES…...
大道至简 少字全意 易经的方式看 jvm基础 、 内存模型 、 gc、 内存异常、内存调优实战案例 、类加载机制、双亲委派模型 适用于 懂而久未用回忆 ,不懂而需明正理而用
目录 介绍 内存模型 一、线程私有区域 二、线程共享区域 1.堆Heap 2. 方法区Method Area 3.运行时常量池 Runtime constant Pool 三、直接内存(Direct Memory) 四、内存异常与调优 五、总结对比 类加载机制 一、类加载的三大阶段 二、双亲委派模型 三、类加载的特…...
【Java学习】继承
一、继承 子类继承父类,子类这个类变量的引用在原有的指向子类自己类变量空间的原有访问权限上,增加上了父类类变量空间的访问权限,此时子类类变量指向的空间变为了原来子类类变量空间加上父类类变量空间,此时子类类变量空间就变成…...
Ubuntu24安装MongoDB(解压版)
目录 0.需求说明1.环境检查2.下载软件2.1.下载MongoDB服务端2.2.下载MongoDB连接工具(可略过)2.3.检查上传或下载的安装包 3.安装MongoDB3.1.编辑系统服务3.2.启动服务3.3.客户端连接验证3.3.1.创建管理员用户 4.远程访问4.1.开启远程访问4.2.开放防火墙 0.需求说明 问&#x…...
计算机毕业设计Python考研院校推荐系统 考研分数线预测 考研推荐系统 考研可视化(代码+LW文档+PPT+讲解视频)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
Python 爬虫框架对比与推荐
Python 爬虫框架对比与推荐 Python 爬虫框架对比与推荐1. Scrapy1.1 框架介绍1.2 优点1.3 缺点1.4 适用场景 2. PySpider2.1 框架介绍2.2 优点2.3 缺点2.4 适用场景 3. Selenium3.1 框架介绍3.2 优点3.3 缺点3.4 适用场景 4. BeautifulSoup Requests(自定义方案&am…...
本地DeepSeek模型GGUF文件转换为PyTorch格式
接前文,我们在本地Windows系统上,基于GGUF文件部署了DeepSeek模型(DeepSeek-R1-Distill-Qwen-1.5B.gguf版本),但是GGUF是已经量化的版本,我们除了对其进行微调之外,无法对其训练,那么还有没有其他办法对本地的GGUF部署的DeepSeek模型进行训练呢?今天我们就反其道而行之…...
自动化测试框架搭建-单次接口执行-三部曲
目的 判断接口返回值和提前设置的预期是否一致,从而判断本次测试是否通过 代码步骤设计 第一步:前端调用后端已经写好的POST接口,并传递参数 第二步:后端接收到参数,组装并请求指定接口,保存返回 第三…...
SAP F1搜索帮助 添加自定义功能按钮
最近deepseek 比较火,好多伙伴把deep seek 调用集成到SAP 系统,集成需要方便的去查询问题,方便一点就是添加在F1搜索帮助的地方,看到有朋友问看自定义按钮怎么添加在F1的工具栏,跟踪了下代码,尝试了下&…...
Webpack,Vite打包的理解
Webpack 和 Vite 都是现代前端开发中常用的构建工具,用于打包和优化项目代码。尽管它们的目标相似,但在设计理念、工作方式和适用场景上存在显著差异。 Webpack Webpack 是一个模块打包工具,主要用于将多个模块(如 JavaScript、…...
ollama部署大模型,本地调用
Ollama是一个强大的大型语言模型平台,它允许用户轻松地下载、安装和运行各种大型语言模型。在本文中,我将指导你如何在你的本地机器上部署Ollama,并展示如何使用Python进行简单的API调用以访问这些模型。 最近很多人在学习大模型的时候&…...
【ISO 14229-1:2023 UDS诊断(ECU复位0x11服务)测试用例CAPL代码全解析⑩】
ISO 14229-1:2023 UDS诊断【ECU复位0x11服务】_TestCase10 作者:车端域控测试工程师 更新日期:2025年02月18日 关键词:UDS诊断协议、ECU复位服务、0x11服务、ISO 14229-1:2023 TC11-010测试用例 用例ID测试场景验证要点参考条款预期结果TC…...
opencv实时二维码识别的一种实现与思路分享
在嵌入式平台上比如 rk3568 这种弱鸡的平台,要做到实时视频处理就非常鸡肋,不像英伟达那种 deepstrem 什么的。 开始的时候,我们使用python 下的 pyzbar + opencv opencv 读取摄像头的数据然后每帧送到 pyzbar 二维码识别函数里面进行处理,然后打印出识别的数字。结果,非常…...