当前位置: 首页 > 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…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

数据结构:递归的种类(Types of Recursion)

目录 尾递归&#xff08;Tail Recursion&#xff09; 什么是 Loop&#xff08;循环&#xff09;&#xff1f; 复杂度分析 头递归&#xff08;Head Recursion&#xff09; 树形递归&#xff08;Tree Recursion&#xff09; 线性递归&#xff08;Linear Recursion&#xff09;…...

深入浅出WebGL:在浏览器中解锁3D世界的魔法钥匙

WebGL&#xff1a;在浏览器中解锁3D世界的魔法钥匙 引言&#xff1a;网页的边界正在消失 在数字化浪潮的推动下&#xff0c;网页早已不再是静态信息的展示窗口。如今&#xff0c;我们可以在浏览器中体验逼真的3D游戏、交互式数据可视化、虚拟实验室&#xff0c;甚至沉浸式的V…...

Win系统权限提升篇UAC绕过DLL劫持未引号路径可控服务全检项目

应用场景&#xff1a; 1、常规某个机器被钓鱼后门攻击后&#xff0c;我们需要做更高权限操作或权限维持等。 2、内网域中某个机器被钓鱼后门攻击后&#xff0c;我们需要对后续内网域做安全测试。 #Win10&11-BypassUAC自动提权-MSF&UACME 为了远程执行目标的exe或者b…...

python基础语法Ⅰ

python基础语法Ⅰ 常量和表达式变量是什么变量的语法1.定义变量使用变量 变量的类型1.整数2.浮点数(小数)3.字符串4.布尔5.其他 动态类型特征注释注释是什么注释的语法1.行注释2.文档字符串 注释的规范 常量和表达式 我们可以把python当作一个计算器&#xff0c;来进行一些算术…...