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

C++小碗菜之五:关键字static

“一个人的命运啊,当然要靠自我奋斗,但也要考虑到历史的行程。”     ——2009年4月23日在视察中国联合工程公司时的讲话

目录

​编辑

前言

static在局部作用域中的作用

给出例子:

修改上面给出的例子:

为什么不使用全局变量,而是使用 static 变量

作用域限制

static在文件作用域中的作用

结束语


总阅读时间约为 10~15分钟。

前言

在编程中,变量的作用域和生命周期是至关重要的概念。我们在函数中定义的局部变量通常在函数执行完毕后销毁,下一次调用时重新初始化。然而,有时我们需要变量在多次函数调用之间保留其值,而不被其他模块轻易访问。这就引出了 static 变量 的重要性。本文将详细解析 static 变量的特点及其在不同场景中的应用,同时对比它与全局变量的优缺点,并通过代码示例说明其作用域的限制。 

static在局部作用域中的作用

通常,函数中定义的局部变量在函数作用域结束时消失。当再次调用这个函数时,会重新创建该变量的存储空间,其值会被重新初始化。

给出例子:

#include <iostream>void example() {int x = 0; // 每次调用函数都会重新初始化 x 为 0x++;std::cout << "x: " << x << std::endl;}int main() {example(); // 输出 x: 1example(); // 输出 x: 1example(); // 输出 x: 1return 0;}

在这个例子中,每次调用 example,局部变量 x 的值都会从 0 重新开始。

修改上面给出的例子:

如果想使局部变量的值在程序的整个生命期里仍然存在,我们可以定义函数的局部变量为static(静态的),并给它一个初始值。初始化只在函数第一次调用时执行,函数调用之间变量的值保持不变。


#include <iostream>void example() {static int x = 0;x++;std::cout << "x: " << x << std::endl;}int main() {example(); // 输出 x: 1example(); // 输出 x: 2example(); // 输出 x: 3return 0;}

在这个例子中,我们定义函数的局部变量 x 为static(静态的),并给它一个初始值在函数的后续调用中,x 保留上次调用后的值,而不是重新初始化。

为什么不使用全局变量,而是使用 static 变量

作用域限制

全局变量:在整个程序中可访问,任何函数都可以随意读取和修改其值。这种广泛的可见性容易导致意外的修改或难以追踪的错误。

static 局部变量:作用域仅限于定义它的函数,避免了其他代码模块无意间修改或依赖它。这种限制帮助局部化错误,使问题更容易排查。

static在文件作用域中的作用

static的第二层意思和前面的含义相关,即在某个作用域外不可访问。当应用static于函数名和所有函数外部的变量时,它的意思是在文件的外部不可以使用这个名字。函数名或变量是局部于文件的;我们

说它具有文件作用域(file scope)。例如,编译和链接下面两个文件会引起链接器错误

File1.cpp

#include <iostream>int globalVar = 10; // 全局变量,其他文件也可以访问static int fileStaticVar = 20; // 静态变量,仅限于本文件void globalFunction() {std::cout << "This is a global function." << std::endl;}static void fileStaticFunction() {std::cout << "This is a file static function." << std::endl;}

File2.cpp

#include <iostream>// 声明 file1.cpp 中的全局变量和函数extern int globalVar;extern void globalFunction();int main() {std::cout << "Accessing globalVar: " << globalVar << std::endl; // OKglobalFunction(); // OKstd::cout << fileStaticVar << std::endl; // 错误:无法访问 fileStaticVarfileStaticFunction(); // 错误:无法调用 fileStaticFunctionreturn 0;}

编译并链接:

g++ file1.cpp file2.cpp -o program

编译结果说明:

·  fileStaticVar 和 fileStaticFunction 是 file1.cpp 的私有实现,不能被 file2.cpp 访问。

·  file1PublicFunction 是 file1.cpp 中对外暴露的接口,可以被 file2.cpp 调用。

结束语

通过本文的介绍,我们深入了解了 static 变量在 C++ 中的应用及其与全局变量的不同之处。静态变量不仅可以在函数间保留状态,还能够通过文件作用域限制外部访问,提高模块的安全性和封装性。合理使用 static 变量能够帮助我们在编程中减少错误、提高代码的可维护性。

相关阅读

C/C++ 中 static 的用法全局变量与局部变量 | 菜鸟教程

相关文章:

C++小碗菜之五:关键字static

“一个人的命运啊&#xff0c;当然要靠自我奋斗&#xff0c;但也要考虑到历史的行程。” ——2009年4月23日在视察中国联合工程公司时的讲话 目录 ​编辑 前言 static在局部作用域中的作用 给出例子&#xff1a; 修改上面给出的例子&#xff1a; 为什么不使用全局变量…...

deepstream笔记

创建pipeline pipeline gst_pipeline_new("audio-player");创建filesrc类型元素并命名为file-source&#xff1b; GstElement *source gst_element_factory_make("filesrc", "file-source");通过元素名file-source获取元素对应的指针&#x…...

Pinpoint 是一个开源的分布式追踪系统

pinpointagent2.2.2.tar 是 Pinpoint 的一个版本&#xff0c;Pinpoint 是一个开源的分布式追踪系统&#xff0c;专门用于对 Java 应用程序进行性能监控、日志记录和故障诊断。它可以帮助开发人员和运维人员追踪和分析微服务架构中服务之间的调用链&#xff0c;并进行性能分析。…...

H3C交换机远程登录基本配置

设备信息 H3C Comware Software, Version 7.1.070, Release 6312P02 Copyright (c) 2004-2021 New H3C Technologies Co., Ltd. All rights reserved. H3C S6520X-54QC-EI Telnet登录设备基本配置 1、开启telnet服务 system-view telnet server enable 2、telnet登录设备终…...

python关闭线程池来关闭线程

在 Python 中&#xff0c;使用线程池&#xff08;如 concurrent.futures.ThreadPoolExecutor 或 multiprocessing.pool.ThreadPool&#xff09;来管理和执行多个线程是一种常见的并发编程方式。关于关闭线程池以及关闭后线程的状态&#xff0c;以下是详细的解释和指导。 使用 …...

生成式AI:药学科普的新引擎

在信息爆炸的时代&#xff0c;药学知识的普及显得尤为重要。而今&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;正以其强大的内容生成和数据分析能力&#xff0c;悄然改变着传统的药学科普模式。它不仅能加速信息的传递&#xff0c;更能为患者提供个性化、易…...

洛谷 p3392 涂条纹

题目&#xff1a; 思路&#xff1a; 简单的模拟题&#xff0c;模拟题好麻烦&#xff0c;但是思路走好就可以。首先我们可以求出每一行&#xff0c;红&#xff0c;蓝&#xff0c;白的个数。涂蓝色和白色为了涂色更少&#xff0c;所以涂蓝色要选择第i行蓝色个数最多的&#xff0…...

64.基于SpringBoot + Vue实现的前后端分离-新闻资讯系统(项目 + 论文)

项目介绍 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;文章信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广…...

Y3编辑器教程8:资源管理器与存档、防作弊设置

文章目录 一、资源管理器简介1.1 界面介绍1.2 资源商店1.3 AI专区1.3.1 AI文生图1.3.2 AI图生图1.3.3 立绘头像 二、导入导出2.1 文件格式2.2 模型导入2.2.1 模型制作后导出2.2.2 模型文件导入Y3编辑器2.2.3 Y3编辑器角色、装饰物模型要求 2.3 纹理导入2.4 材质贴图2.4.1 材质支…...

智慧社区电子商务系统:实现社区资源的数字化管理

2.1vue技术 Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式JavaScript框架。 [5] 与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项…...

精准提升:从94.5%到99.4%——目标检测调优全纪录

&#x1f680; 目标检测模型调优过程记录 在进行目标检测模型的训练过程中&#xff0c;我们面对了许多挑战与迭代。从初始模型的训练结果到最终的调优优化&#xff0c;每一步的实验和调整都有其独特的思路和收获。本文记录了我在优化目标检测模型的过程中进行的几次尝试&#…...

【LLM论文日更】| 训练大型语言模型在连续潜在空间中进行推理

论文&#xff1a;https://arxiv.org/pdf/2412.06769代码&#xff1a;暂未开源机构 &#xff1a;Meta领域&#xff1a;思维链发表&#xff1a;arxiv 研究背景 研究问题&#xff1a;这篇文章要解决的问题是如何在大语言模型&#xff08;LLMs&#xff09;中实现一种新的推理范式&…...

智能家居实训室中,STC单片机驱动的“互联网+”智能家居系统设计

一、引言 随着经济的快速发展&#xff0c;人们对家居环境的智能化、网络化需求日益增强&#xff0c;智能家居的研究也因此受到了国内外相关机构的广泛关注。STC单片机凭借其卓越的性能和广泛的应用领域&#xff0c;成为了智能家居系统设计的优选方案。作为一种先进的微控制器&…...

《C++ 赋能强化学习:Q - learning 算法的实现之路》

在当今科技飞速发展的时代&#xff0c;人工智能无疑是最热门的领域之一&#xff0c;而强化学习作为其中的重要分支&#xff0c;正逐渐改变着我们解决复杂问题的方式。Q - learning 算法作为强化学习中的经典算法&#xff0c;在众多领域如游戏、机器人控制、资源管理等有着广泛的…...

三维模型中的UV展开是什么意思?它有什么优势?

UV展开涉及将三维模型的表面展开为一个或多个二维区域&#xff0c;以便将纹理图像正确地映射到模型上。这个过程类似于将一个立体物体的表面切割并平铺开来。UV坐标是用于在二维纹理图像中定位颜色和细节的坐标系统&#xff0c;U和V分别代表纹理图像的水平和垂直轴。 UV展开它…...

怎么在ubuntu系统上安装qt项目的打包工具linuxdeployqt

引言 安装linuxdeployqt方案一方案二 在ubuntu系统上开发的项目最后需要完成打包&#xff0c;qtcreator本身就用一个打包工具&#xff0c;在ubuntu系统上是linuxdeployqt。本文主要记录一下怎么在ubuntu系统上安装qt打包工具linuxdeployqt。 安装linuxdeployqt 前提是已经安装…...

SQL语句整理五-StarRocks

文章目录 查看版本号&#xff1a;SPLIT&#xff1a;insert 和 update 结合 select&#xff1a;报错&#xff1a;1064 - StarRocks planner use long time 3000 ms in memo phase&#xff1a;字段增删改&#xff1a; 查看版本号&#xff1a; select current_version(); current…...

【C#】try-catch-finally语句的执行顺序,以及在发生异常时的执行顺序

try-catch-finally语句 执行顺序 执行 try 块&#xff1a;程序首先尝试执行 try 块中的代码。如果在此期间没有发生异常&#xff0c;则跳过 catch 块&#xff0c;直接执行 finally 块&#xff08;如果存在&#xff09;。 发生异常时的处理&#xff1a; 如果在 try 块中发生了…...

【vue】vite + ts +vue3 安装pinia

vue3 TS 安装使用pinia状态管理_vue3 ts pinia-CSDN博客...

PointPillars:数据预处理

在 PointPillars 算法中&#xff0c;将点云划分为点柱&#xff08;Pillars&#xff09;是核心步骤之一&#xff0c;用于将稀疏点云数据转换为规则的张量表示&#xff0c;方便后续 2D 卷积操作。以下是点云划分为点柱的具体方法和实现步骤&#xff1a; 1. 点云划分为网格 将 3D…...

9.axios底层原理,和promise的对比(2)

&#x1f63a;&#x1f63a;&#x1f63a; 和promise的对比 完全可以直接使用 Promise 来发 HTTP 请求&#xff0c;比如用原生 fetch Promise 就可以实现网络请求功能&#x1f447; ✅ 用 Promise fetch 的写法&#xff08;原生&#xff09; fetch(‘https://api.example.c…...

关键字--sizeof

sizeof 是 C 中的一个编译时运算符&#xff0c;用于获取一个类型或对象在内存中所占的字节数&#xff08;单位&#xff1a;字节&#xff0c;byte&#xff09;。 用法 获取类型的大小&#xff1a; std::cout << sizeof(int) << std::endl; // 输出int类型的字节数…...

IDEA中的debug使用技巧

详细教学视频见b站链接&#xff1a;IDEA的debug调试 CSDN详细博客文章链接&#xff1a;debug文章学习 以下为个人学习记录总结&#xff1a; idea中的debug模式界面如下&#xff1a; 现在详细介绍图标作用&#xff1a; 图标一&#xff08;Show Execution Point&#xff09;&…...

【Java后端基础 005】ThreadLocal-线程数据共享和安全

&#x1f4da;博客主页&#xff1a;代码探秘者 ✨专栏&#xff1a;文章正在持续更新ing… ✅C语言/C&#xff1a;C&#xff08;详细版&#xff09; 数据结构&#xff09; 十大排序算法 ✅Java基础&#xff1a;JavaSE基础 面向对象大合集 JavaSE进阶 Java版数据结构JDK新特性…...

“一代更比一代强”:现代 RAG 架构的演进之路

编者按&#xff1a; 我们今天为大家带来的文章&#xff0c;作者的观点是&#xff1a;RAG 技术的演进是一个从简单到复杂、从 Naive 到 Agentic 的系统性优化过程&#xff0c;每一次优化都是在试图解决无数企业落地大语言模型应用时出现的痛点问题。 文章首先剖析 Naive RAG 的基…...

Golang——5、函数详解、time包及日期函数

函数详解、time包及日期函数 1、函数1.1、函数定义1.2、函数参数1.3、函数返回值1.4、函数类型与变量1.5、函数作参数和返回值1.6、匿名函数、函数递归和闭包1.7、defer语句1.8、panic和recover 2、time包以及日期函数2.1、time.Now()获取当前时间2.2、Format方法格式化输出日期…...

会计 - 金融负债和权益工具

一、金融负债和权益工具区分的基本原则 (1)是否存在无条件地避免交付现金或其他金融资产的合同义务 如果企业不能无条件地避免以交付现金或其他金融资产来履行一项合同义务,则该合同义务符合金融负债的义务。 常见的该类合同义务情形包括:- 不能无条件避免的赎回; -强制…...

n皇后问题的 C++ 回溯算法教学攻略

一、问题描述 n皇后问题是经典的回溯算法问题。给定一个 nn 的棋盘&#xff0c;要求在棋盘上放置 n 个皇后&#xff0c;使得任何两个皇后之间不能互相攻击。皇后可以攻击同一行、同一列以及同一对角线上的棋子。我们需要找出所有的合法放置方案并输出方案数。 二、输入输出形…...

[蓝桥杯]搭积木

搭积木 题目描述 小明对搭积木非常感兴趣。他的积木都是同样大小的正立方体。 在搭积木时&#xff0c;小明选取 mm 块积木作为地基&#xff0c;将他们在桌子上一字排开&#xff0c;中间不留空隙&#xff0c;并称其为第 0 层。 随后&#xff0c;小明可以在上面摆放第 1 层&a…...

CETOL 6σ v12.1 三维公差分析软件现已可供下载

一、新版本发布 德克萨斯州麦金尼 — 2025年6月5日 —Sigmetrix 宣布其最新版本的 CETOL 6σ 公差分析软件&#xff08;v12.1&#xff09;现已可供立即下载。公差分析在诸多方面为企业发展带来益处。它通过平衡质量与制造成本&#xff0c;助力企业提升盈利能力。企业还可借此缩…...