为什么要用static

news2024/11/10 15:38:30

前言

本文主要介绍C/C++中的static,以及为什么要用static,别人的代码中有时会突然使用用static,看的一脸蒙圈,为什么要用static,我不用难道不行吗?对啊为什么呢?

正文

static是C/C++中一个很重要的关键字,是常见的函数与变量(C++中还包括类)的修饰符,它主要的作用是改变变量的存储方式(局部变量),限制作用域(全局变量、函数、类的成员),实现类的共享资源(类的静态成员变量)。
说到这了不得不拿出一张图
在这里插入图片描述
总的来说static就是修饰变量和函数的
它有以下几大特性

1.在函数中声明变量时,static 关键字指定变量只初始化一次,并在之后调用该函数时保留其状态
2.在全局或命名空间范围 (在单个文件范围内声明变量或函数时) static 关键字指定变量或函数为内部链接,从而使得全局变量或函数的作用域变小,即外部文件无法引用该变量或函数
3.static关键字修饰的变量没有赋值时,对于局部变量,它的初始值是未定义的(对于内置类型,在某些情况下编译器可能会将其初始化为0);对于全局变量,会被隐式初始化为0(对于算术类型)或null指针(对于指针类型)(其实不管static是否修饰,全局变量都有这个效果)
4.static修饰局部变量时,不会改变变量的作用域,但是会改变局部变量的存储位置,从而使得局部变量的生命周期变长,即该变量的存储期会变为静态存储期,即它的生命周期贯穿整个程序执行期间
5.静态成员为所有类对象所共享,不属于某个具体的实例
6.静态成员变量,如果它们是常量整型或枚举类型,并且是在类内部声明的,那么可以在类内部进行初始化(C++11及更高版本)。否则,必须在类外部进行初始化
7.静态成员函数没有隐藏的this指针,不能直接访问类的非静态成员变量和成员函数,只能使用静态成员变量
8.静态成员函数可以直接在类内部定义(即实现),而不需要在类外部再次声明(除非有特殊的模板或内联需求)

细分之后可以分成下面四类

1. 修饰局部变量(函数内的变量)

在这里插入图片描述

2. 修饰全局变量

在这里插入图片描述
在这里插入图片描述

注:第二条中所说的:即外部文件无法引用该变量或函数(外部文件指的是外部源文件,即.cpp文件,当静态全局变量定义并声明在单独的.h文件中时它能够被访问)
在这里插入图片描述

3. 修饰函数

见二修饰全局变量

4. 修饰类的成员变量和成员函数

静态成员变量必须在类外进行声明初始化,
在这里插入图片描述

否则
在这里插入图片描述
静态成员函数
在这里插入图片描述

为什么要用static

1.保持状态:当你需要函数在多次调用之间保持某些状态时,静态局部变量非常有用
2.在全局作用域中,也可以通过static来限制变量的作用域,使其更像是一个私有的全局变量,而且还可以避免命名冲突。
3.static函数具有内部链接性,因此它们通常用于实现只在特定文件或编译单元内部使用的辅助函数或工具函数。这样做可以减少全局命名空间的污染,并使代码结构更加清晰
4.静态成员函数属于类本身,而不是类的任何特定对象实例。因此,它们不需要通过类的对象来调用,而是可以直接通过类名和作用域解析运算符(::)来调用

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

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

相关文章

浅试扫雷游戏(简易版)

目录 1. 扫雷游戏分析和设计 1)扫雷游戏的功能说明 2)游戏的分析和设计 2.扫雷游戏的代码实现 1. 扫雷游戏分析和设计 1)扫雷游戏的功能说明 使用控制台实现经典的扫雷游戏游戏可以通过菜单实现继续玩或者退出游戏扫雷的棋盘是9*9的格子…

“前缀和”专题篇二

目录 和为K的子数组 和可被K整除的子数组 连续数组 矩阵区域和 和为K的子数组 题目 思路 我们可能想到的是,从头到尾扫描数组,然后分别计算以该位置为开始,一直到数组末尾,符合和为K的子数组,但是这种方法的时间复…

线上研讨会 | CATIA助力AI提升汽车造型设计

报名链接: 2024探索之旅第二季

Linux Shell基础常用脚本命令及应用案例

文章目录 常用的 Shell 命令1. 变量2. 注释3. 输出4. 输入5. 条件判断6. 循环7. 函数8. 运算9. 流程控制10. 文件和目录操作11. 错误处理 Shell 脚本应用案例1. Hello World 脚本2. 创建系统账户及设置密码3. 日志文件备份4. 一键部署 LNMP 环境5. 检查磁盘空间6. 自动安装软件…

Nginx反向代理的使用场景

Nginx Vue使用npm命令打包:npm run build Nginx的定位:主要用于做反向代理,一般都是用它来做前端页面的服务器,动态资源代理到后端服务器。这样做的好处是可以避免跨域请求带来的不便。 我们知道,在前端我们开发的时…

三、AI工作流(低代码)的趋势即将崛起,输入-按钮组件详解,带你轻松玩转按钮组件

对工作流感兴趣的小伙伴可以去试一试。🔥偷偷的告诉你,它的GPTo4.0 不要💰。传送门:https://www.nyai.chat/chat?invitenyai_1141439 一、能用AI工作流介绍 能用AI-工作流是一个“低代码”工具、它也是个人或者中小企业的提效工…

C#语言基础速成Day07

“知止而后有定&#xff0c;定而后能静&#xff0c;静而后能安&#xff0c;安而后能虑&#xff0c;虑而后能得。” 目录 前言文章有误敬请斧正 不胜感恩&#xff01;||Day07 C#常见数据结构&#xff1a;1. 集合&#xff08;Collection&#xff09;1.1 **List<T>**1.2 **H…

MATLAB 样条插值

订阅专栏后,复制完整代码到MATLAB上面,即可获得跟本文相同的运行结果。 点击以下链接也可下载: https://download.csdn.net/download/callmeup/89635701 MATLAB插值代码 插值在MATLAB里面很简单,一个函数即可。 本文给出了已知点的坐标、待插值点的横坐标,可按要求插出来…

使用 Gradio 开发 ChatBot

Gradio 提供了 ChatInterface 组件&#xff0c;组件包括一个输入框、一个 ChatBox 区域、和一些按钮。同 interface&#xff0c;ChatInterface 通过一个处理函数进行处理&#xff0c;处理函数包括两个参数 message 和 history&#xff0c;message 是当前用户提交的问题&#xf…

[图解]需要≠需求-《分析模式》漫谈

1 00:00:00,760 --> 00:00:02,910 今天的《分析模式》漫谈 2 00:00:02,920 --> 00:00:04,180 我们来说一下 3 00:00:04,490 --> 00:00:06,490 需要不等于需求 4 00:00:10,490 --> 00:00:11,760 还是第一章 5 00:00:13,120 --> 00:00:15,020 这里 6 00:00:1…

[C#]实现GRPC通讯的服务端和客户端实例

最近要做两个软件之间消息的通讯&#xff0c;学习了一下GRPC框架的通讯。根据官方资料做了一个实例。 官方资料请参考&#xff1a;Create a .NET Core gRPC client and server in ASP.NET Core | Microsoft Learn 开发平台&#xff1a;Visual Studio 2022 开发前提条件&#x…

llama的神经网络结构;llama的神经网络结构中没有MLP吗;nanogpt的神经网络结构;残差是什么;残差连接:主要梯度消失

目录 解释代码 潜在问题和修正 结论 llama的神经网络结构 神经网络结构概述 举例说明 llama的神经网络结构中没有MLP吗 nanogpt的神经网络结构 1. 词嵌入层(Embedding Layer) 2. Transformer编码器层(Transformer Encoder Layer) 3. 层归一化(Layer Normalizat…

Linux文本处理常见工具

文章目录 文件内容查看查看文本文件内容cattacrevnl 查看非文本文件内容hexdumpodxxd 分页查看文件内容moreless 显示文本前后的行内容headtail文件描述符如果找到文件描述符 查看最新日志范例&#xff1a;找出IP地址的那一行 cut--按列抽取文本按分隔符按字符位置取网卡ip tr-…

Rocky系统部署k8s1.28.2单节点集群(Containerd)+Kuboard

目录 Kubernetes介绍 Kubernetes具备的功能 Kubernetes集群角色 Master管理节点组件 Node工作节点组件 非必须的集群插件 Kubernetes集群类型 Kubernetes集群规划 集群前期环境准备 开启Bridge网桥过滤 关闭SWAP交换分区 安装Containerd软件包 K8s集群部署方式 集…

关于归并排序:

![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_urlhttps%3A%2F return 语句开始之后&#xff0c;会执行之前剩余遗留下的语句和状态#include<bits/stdc.h> using namespace std…

Xilinx XAPP585相关

XAPP585中相关的状态机 第一个状态机&#xff1a;这里主要是在对时钟线延迟的基础上&#xff0c;通过BITSLIP操作&#xff0c;做时钟的对齐&#xff1b; 第二个状态机&#xff1a;这里对c_delay_in所做的操作&#xff0c;主要是对时钟线的延迟进行控制&#xff1b; delay_con…

远程代码执行漏洞

1.简介 远程代码执行(remote code execution)简称RCE&#xff0c;由于应用程序在调用一些能够将字符串转换为代码的函数(如PHP中的eval)时&#xff0c;没有考虑用户是否控制这个字符串&#xff0c;则会导致代码执行漏洞的发生Webshell能够执行代码&#xff0c;本质上就是利用了…

新AI工程师Genie强势来袭,84秒解决代码问题

&#x1f989; AI新闻 &#x1f680; 新AI工程师Genie强势来袭&#xff0c;84秒解决代码问题 摘要&#xff1a;新兴AI软件工程师Genie因其超凡能力而引发关注&#xff0c;它在SWE-Bench排行榜上以30.07%的问题解决率远超第二名。Genie能模拟人类工程师的思维&#xff0c;自动…

CV党福音:YOLOv8实现语义分割(一)

前面我们得知YOLOv8不但可以实现目标检测任务&#xff0c;还包揽了分类、分割、姿态估计等计算机视觉任务。在上一篇博文中&#xff0c;博主已经介绍了YOLOv8如何实现分类&#xff0c;在这篇博文里&#xff0c;博主将介绍其如何将语义分割给收入囊中。 YOLOv8语义分割架构图 …

LeetCode - 54 - 螺旋矩阵

力扣54题 题目描述&#xff1a; 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 题解思路&#xff1a; 54题和59题 螺旋矩阵Ⅱ 有些微区别&#xff0c;59是nn的方形矩阵&#xff0c;但是54需要考虑行和列不相等的情况…