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

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

目录

​编辑

前言

static在局部作用域中的作用

给出例子:

修改上面给出的例子:

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

作用域限制

static在文件作用域中的作用

结束语


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

前言

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

static在局部作用域中的作用

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

给出例子:

#include <iostream>

void example() {

    int x = 0; // 每次调用函数都会重新初始化 x 为 0

    x++;

    std::cout << "x: " << x << std::endl;

}



int main() {

    example(); // 输出 x: 1

    example(); // 输出 x: 1

    example(); // 输出 x: 1

    return 0;

}

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

修改上面给出的例子:

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


#include <iostream>

void example() {

    static int x = 0;

    x++;

    std::cout << "x: " << x << std::endl;

}



int main() {

    example(); // 输出 x: 1

    example(); // 输出 x: 2

    example(); // 输出 x: 3

    return 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; // OK

    globalFunction(); // OK



   std::cout << fileStaticVar << std::endl; // 错误:无法访问 fileStaticVar

   fileStaticFunction(); // 错误:无法调用 fileStaticFunction



    return 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 的用法全局变量与局部变量 | 菜鸟教程

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开源云原生数据仓库ByConity ELT 的测试体验

ByConity 是分布式的云原生SQL数仓引擎&#xff0c;擅长交互式查询和即席查询&#xff0c;具有支持多表关联复杂查询、集群扩容无感、离线批数据和实时数据流统一汇总等特点。 ByConity 是一个云原生的、高性能的实时数据仓库&#xff0c;而 ELT&#xff08;Extract&#xff0c…

Linux -- 线程的优点、pthread 线程库

目录 线程的优点 pthread 线程库 前言 认识线程库 简单验证线程的独立栈空间 线程的优点 与进程之间的切换相比&#xff0c;线程之间的切换需要操作系统做的工作要少得多。 调度进程时&#xff0c;CPU 中有一个 cache&#xff08;缓存&#xff0c;提高运行效率&#xff0…

数字IC前端学习笔记:脉动阵列的设计方法学(四)

相关阅读 数字IC前端https://blog.csdn.net/weixin_45791458/category_12173698.html?spm1001.2014.3001.5482 引言 脉动结构&#xff08;也称为脉动阵列&#xff09;表示一种有节奏地计算并通过系统传输数据的处理单元(PEs)网络。这些处理单元有规律地泵入泵出数据以保持规则…

观察者模式和发布-订阅模式有什么异同?它们在哪些情况下会被使用?

大家好&#xff0c;我是锋哥。今天分享关于【观察者模式和发布-订阅模式有什么异同&#xff1f;它们在哪些情况下会被使用&#xff1f;】面试题。希望对大家有帮助&#xff1b; 观察者模式和发布-订阅模式有什么异同&#xff1f;它们在哪些情况下会被使用&#xff1f; 1000道 …

【LeetCode】726、原子的数量

【LeetCode】726、原子的数量 文章目录 一、递归: 嵌套类问题1.1 递归: 嵌套类问题 二、多语言解法 一、递归: 嵌套类问题 1.1 递归: 嵌套类问题 遇到 ( 括号, 则递归计算子问题 遇到大写字母, 或遇到 ( 括号, 则清算历史, 并开始新的记录 记录由两部分组成: 大写字母开头的 …

【Select 语法全解密】.NET开源ORM框架 SqlSugar 系列

系列文章目录 &#x1f380;&#x1f380;&#x1f380; .NET开源 ORM 框架 SqlSugar 系列 &#x1f380;&#x1f380;&#x1f380; 文章目录 系列文章目录前言一、Select 执行位置二、返回一个字段和多个字段三、单表返回DTO四、多表返回DTO4.1 手动DTO4.2 实体自动映射14.…

WebRTC服务质量(11)- Pacer机制(03) IntervalBudget

WebRTC服务质量&#xff08;01&#xff09;- Qos概述 WebRTC服务质量&#xff08;02&#xff09;- RTP协议 WebRTC服务质量&#xff08;03&#xff09;- RTCP协议 WebRTC服务质量&#xff08;04&#xff09;- 重传机制&#xff08;01) RTX NACK概述 WebRTC服务质量&#xff08;…

分布式协同 - 分布式事务_2PC 3PC解决方案

文章目录 导图Pre2PC&#xff08;Two-Phase Commit&#xff09;协议准备阶段提交阶段情况 1&#xff1a;只要有一个事务参与者反馈未就绪&#xff08;no ready&#xff09;&#xff0c;事务协调者就会回滚事务情况 2&#xff1a;当所有事务参与者均反馈就绪&#xff08;ready&a…

计算机图形学知识点汇总

一、计算机图形学定义与内容 1.图形 图形分为“图”和“形”两部分。 其中&#xff0c;“形”指形体或形状&#xff0c;存在于客观世界和虚拟世界&#xff0c;它的本质是“表示”&#xff1b;而图则是包含几何信息与属性信息的点、线等基本图元构成的画面&#xff0c;用于表达…

Nginx区分PC端和移动端访问

在使用Nginx时&#xff0c;可以通过$http_user_agent变量来判断用户访问的客户端类型&#xff0c;从而提供不同的内容或服务。下面是一个基于$http_user_agent变量来判断是否为PC访问的Nginx配置示例。 1. 理解$http_user_agent变量的含义及其在Nginx中的用途 $http_user_agen…

方法。。。

1. 方法概述 1.1 方法的概念 ​** 方法&#xff08;method&#xff09;是程序中最小的执行单元** 注意&#xff1a; 方法必须先创建才可以使用&#xff0c;该过程成为方法定义方法创建后并不是直接可以运行的&#xff0c;需要手动使用后&#xff0c;才执行&#xff0c;该过程…

jasypt原理

jasypt原理 一、背景知识二、原理分析1、(uml中蓝色)加载Encryptor、Detector和Resolver2、(uml中红色)加载EnableEncryptablePropertiesBeanFactoryPostProcessor3、(uml中绿色)解密过程 以jasypt 1.14为例 一、背景知识 需要了解spring的加载顺序&#xff1a; step1:主要是…

【UE5 C++课程系列笔记】13——GameInstanceSubsystem的简单使用

目录 概念 基本使用案例 效果 步骤 概念 UGameInstanceSubsystem 类继承自 USubsystem&#xff0c;它与 GameInstance 紧密关联&#xff0c;旨在为游戏提供一种模块化、可方便扩展和管理的功能单元机制。在整个游戏运行期间&#xff0c;一个 GameInstance 可以包含多个 UGa…

SpringCloud 系列教程:微服务的未来(二)Mybatis-Plus的条件构造器、自定义SQL、Service接口基本用法

本篇博客将深入探讨 MyBatis-Plus 的三个核心功能&#xff1a;条件构造器、自定义 SQL 和 Service 接口的基本用法。通过对这些功能的学习和掌握&#xff0c;开发者能够更加高效地使用 MyBatis-Plus 进行业务开发。 目录 前言 条件构造器 自定义SQL Service接口基本用法 总结…

我的 2024 年终总结

2024 年&#xff0c;我离开了待了两年的互联网公司&#xff0c;来到了一家聚焦教育机器人和激光切割机的公司&#xff0c;没错&#xff0c;是一家硬件公司&#xff0c;从未接触过的领域&#xff0c;但这还不是我今年最重要的里程碑事件 5 月份的时候&#xff0c;正式提出了离职…

STM32-笔记11-手写带操作系统的延时函数

1、为什么带操作系统的延时函数&#xff0c;和笔记10上的延时函数不能使用同一种&#xff1f; 因为笔记10的延时函数在每次调用的时候&#xff0c;会一直开关定时器&#xff0c;而在FreeRTOS操作系统中&#xff0c;SysTick定时器当作时基使用。 时基是一个时间显示的基本单位。…

人工智能与物联网:从智慧家居到智能城市的未来蓝图

引言&#xff1a;未来已来&#xff0c;智能化的世界 想象一下&#xff0c;一个早晨&#xff0c;智能闹钟根据你的睡眠状态自动调整叫醒时间&#xff0c;咖啡机早已备好热腾腾的咖啡&#xff0c;窗帘缓缓拉开&#xff0c;迎接清晨的阳光。这不是科幻小说中的场景&#xff0c;而是…

流程控制

第一章 流程控制语句 在一个程序执行的过程中&#xff0c;各条语句的执行顺序对程序的结果是有直接影响的。所以&#xff0c;我们必须清楚每条语句的执行流程。而且&#xff0c;很多时候要通过控制语句的执行顺序来实现我们想要的功能。 1.1 流程控制语句分类 ​ 顺序结构 …

台球助教平台系统开发APP和小程序信息收藏功能需求解析(第十二章)

以下是开发台球助教系统客户端&#xff08;APP&#xff0c;小程序&#xff0c;H5&#xff09;几端的信息收藏功能的详细需求和功能说明&#xff0c;内容比较详细&#xff0c;可以说是一个教科书式的详细说明了&#xff0c;这套需求说明不仅仅用在我们的台球助教系统程序上&…

RISC-V 医疗芯片发展方向探究及展望

&#xff08;一&#xff09;研究背景与意义 近年来&#xff0c;RISC-V作为一种开源指令集架构在芯片领域迅速兴起。它起源于加州大学伯克利分校&#xff0c;于2011年首次公开发布&#xff0c;后凭借其独特优势吸引了全球众多企业、机构以及科研人员的关注与参与。RISC-V具有开…