【学习笔记】C++ 中 static 关键字的作用
目录
- 前言
- static 作用在变量上
- static 作用在全局变量上
- static 作用在局部变量上
- static 作用在成员变量上
- static 作用在函数上
- static 作用在函数上
- static 作用在成员函数上
前言
在 C/C++ 中,关键字 static
在不同的应用场景下,有不同的作用,这里总结一下,避免在使用时弄混。
我按照以下的逻辑来分类 static
的作用场景
- static 作用在变量上
- static 作用在全局变量上:限制全局变量在本文件上
- static 作用在局部变量上:即使离开变量作用域,也保存变量值,比如用作计数器
- static 作用在成员变量上 :对象间共享该变量
- static 作用在函数上
- static 作用在函数上:函数可见性限制在本文件中(即使函数被声明在头文件,引用该头文件的其他
cpp
文件也无法使用该函数) - static 作用在成员函数上
- static 作用在函数上:函数可见性限制在本文件中(即使函数被声明在头文件,引用该头文件的其他
static 作用在变量上
static 作用在全局变量上
对于普通的全局变量来说,同一项目中的其他文件也可访问相同的全局变量,若为了限制全局变量在本文件中,则需要在这个全局变量上加一个 static
,这样该变量就只能在本文件可见。
我们先来演示一下,如何在一个文件中使用另一个文件的全局变量。
假设有 a.cpp
和 b.cpp
,我们在 b
中定义一个全局变量 staticValue
,然后在 a
中打印出来。
// b.cpp
// 全局变量
int staticValue = 10;void staticMain() {// ...
}
// a.cpp
#include <iostream>
using namespace std;// 必须通过 extern 关键字在整个项目搜索 staticValue
extern int staticValue;int main()
{cout << "在 a.cpp 中可见:" << staticValue << endl; // 在 a.cpp 中可见:10
}
显然我们成功在 a
文件中使用到了 b
文件内定义的全局变量。
现在,我希望将 staticValue 的全局可见性,限制在 b 文件内,不让其他文件也可以访问,于是我在 b 的 staticValue 前加上 static 关键字
// b.cpp
// 全局变量
static int staticValue = 10;void staticMain() {// ...
}
将代码如上修改后,当我们再次运行时,程序会在链接阶段报错,报错信息如下,根据描述可见在 a
的 obj
文件(汇编后生成的对象文件)里没有解析到 staticValue
这个变量,达到了我们限制全局变量在本文件内的目的
static 作用在局部变量上
static 作用在局部变量上,即使离开变量作用域,也保存变量值,比如用作计数器。效果如下面的代码所示
可以看到,num
的值是逐渐累加的过程
#include <stdio.h>void count();int main(void)
{int i=0;for (i = 0;i <= 5;i++){count();}return 0;
}
void count()
{/*声明一个静态局部变量*/static int num = 0;num++;printf("%d\n",num); // 1 2 3 4 5 6
}
static 作用在成员变量上
在这种情况下,static
标记的变量可以在多个对象之间共享该变量,在底层上,因为 static
标记的变量并非存在于对象的内存空间,而是存在于数据区中(这涉及到 C 语言的内存布局)。
具体的效果如下面代码所示,我们声明了 3 个学生对象,分别是 zhangsan,lisi 和 wangwu,并在定义他们的时候给他们传入了各自的初始分数,最终求得三个人的总分。
#include <iostream>
using namespace std;class student {
private:static int sumScore;int myScore;
public:student(int m):myScore(m){sumScore += myScore;}int getSumScore() {return sumScore;}
};int student::sumScore = 0; // 静态成员变量必须在类外被初始化int main()
{student zhangsan(10);student lisi(20);student wangwu(30);cout << wangwu.getSumScore() << endl; // 60return 0;
}
关于 static 在修饰成员变量时的注意事项
static
修饰的成员变量属于类,在对象间共享,因此某个对象修改了该变量,对其他对象也是可见的- 静态成员变量的初始化必须要在类外,如上面的代码所示
- 静态成员变量的内存分配是发生在类外初始化的时候,而不是类或者对象创建的时候
- 静态成员变量可以通过类,也可以通过对象来访问,但必须遵守访问可见性(
public
,private
和protected
)
static 作用在函数上
static 作用在函数上
它起到的效果和 static 作用在全局变量上类似,将函数的可见性限制在本文件内。
这里我们直接举被 static 修饰的函数的例子。
假设在 b.cpp 中我们定义了一个 bMain() 的函数,在 b.h 的头文件中进行声明,在 a.cpp 中引入这个头文件,并调用 bMain(),那么是可以正常调用的。
现在,我们在 b.cpp 中,在 bMain() 前加上一个 static 关键字,那么 a.cpp 就不能在调用了。
// b.cpp
#include <iostream>
using namespace std;static void bMain() {cout << "bMain" << endl;
}
// b.hpp
void bMain();
// a.cpp
#include "b.hpp"int main()
{bMain();return 0;
}
执行上述代码,我们可以看到和 “static 作用在全局变量上” 小节类似的报错问题
static 作用在成员函数上
静态成员函数具有和静态成员变量类似的性质和作用,一般可以用这种方式来确定类创建了多少个对象
- 静态成员函数在对象之间共享,或者说它独立于对象之外
- 可以通过对象来调用静态成员函数,也可以通过类名来调用静态成员函数
- 静态成员函数可以访问静态成员变量或其他静态成员函数,但不能使用当前对象指针
#include <iostream>
using namespace std;class student {
private:static int sumObj;
public:student() {sumObj += 1;}static int getObjNum() {return sumObj;}
};int student::sumObj = 0; // 静态成员变量必须在类外被初始化int main()
{student zhangsan;student lisi;student wangwu;cout << "student 有几个对象? " << student::getObjNum() << endl; // 3return 0;
}
可以看到,最终我们输出了 3 个对象
相关文章:
【学习笔记】C++ 中 static 关键字的作用
目录 前言static 作用在变量上static 作用在全局变量上static 作用在局部变量上static 作用在成员变量上 static 作用在函数上static 作用在函数上static 作用在成员函数上 前言 在 C/C 中,关键字 static 在不同的应用场景下,有不同的作用,这…...
攻防世界-web-file_include
1. 题目描述 打开界面,如下代码: 代码很简单,从参数中获取到filename然后include这个filename 2. 思路分析 2.1 首先参考常见做法,将参数设置为php://filter/readconvert.base64-encode/resourceflag.php,看是否有…...
C语言的函数指针、指针函数, 函数数组
函数指针 是指向函数的指针,它允许您在程序运行时动态选择要调用的函数。函数指针可以像普通变量一样传递、存储和使用,这使得它们在许多编程场景中非常有用,如回调函数、函数表、插件架构等。 以下是一个简单的例子来说明函数指针的概念&a…...
笔记本开启WiFi
笔记本开启WiFi 为了节省流量:笔记本开启WiFi 条件 支持热点的电脑;我的是华硕飞行堡垒7。 注意事项 笔记本连接公司网络,公司网络通常都在监管下的,手机连接wifi后,刷抖音、购物网站,公司后台会捕获你…...
力扣第37天----第322题、第279题
力扣第37天----第322题、第279题 文章目录 力扣第37天----第322题、第279题一、第322题--零钱兑换二、第279题--组合总和 Ⅳ 一、第322题–零钱兑换 整体思路,跟前面的几道完全背包差不多,就不具体解释了。有一些细节要注意,见代码注释。…...
【ArcGIS Pro二次开发】(67):处理面要素空洞
这个一个简单的小功能。 有些面要素可能会存在空洞,这个工具的目的就是获取面要素的空洞,或者去除空洞获取要素的边界。 这个功能其实在之前做拓扑功能的时候就已经有了,这次只是单独把它提取出来。因为有时候会单独用到这个功能。 一、要实…...
FPGA-结合协议时序实现UART收发器(一):UART协议、架构规划、框图
FPGA-结合协议时序实现UART收发器(一):UART协议、架构规划、框图 记录FPGA的UART学习笔记,以及一些细节处理,主要参考奇哥fpga学习资料。 本次UART主要采用计数器方法实现,实现uart的稳定性发送和接收功能…...
web请求cookie中expires总结
用意 cookie 有失效日期 "expires",如果还没有过失效期,即使重新启动电脑,cookie 仍然不会丢失 注意:如果没有指定 expires 值,那么在关闭浏览器时,cookie 即失效。 设置 如果cookie存储时间大…...
如何学习Java核心知识
Java作为一门广泛应用于软件开发的编程语言,拥有着强大的生态系统和丰富的资源,是值得投入时间和精力去学习的。以下是一些建议,帮助你系统地学习Java核心知识。 1. 学习Java语言基础: 学习Java语言基础是学习Java的第一步&…...
【AWS】如何用SSH连接aws上的EC2实例(虚拟机)?
目录 0.环境 1.连接结果示例 2.SSH连接思路 3.具体步骤 1)安装并运行ssh服务 2)启动ssh服务 3)在AWS上找到正在运行的EC2实例,并且根据提供的ssh连接语句进行连接 0.环境 windows 11 64位 前提: 有aws账户&…...
数据结构——看完这篇保证你学会队列
数据结构——队列 一、队列的概念二、队列的实现方式三、队列所需要的接口四、接口的详细实现4.1初始化4.2销毁4.3入队4.5出队4.6获取队头元素4.7获取队尾元素4.8获取队列元素个数4.9判空 五、完整代码5.1Queue.h5.2Queue.c5.3test.c 一、队列的概念 队列:只允许在…...
开源免费缺陷管理工具:对比6款
在软件开发环境中,缺陷管理工具是关键的基础设施。例如,在构建一个电商平台时,这些工具能系统地跟踪从发现到解决的各个问题阶段。它们支持多用户协作,实现信息和状态的实时共享。通过数据分析,这些工具还能帮助团队识…...
Weblogic反序列化漏洞
文章目录 1、搭建环境2、漏洞特征3、漏洞利用1)获取用户名密码2)后台上传shell 4、检测工具 1、搭建环境 漏洞环境基于vulhub搭建–进入weak_password的docker环境 sudo docker-compose up -d拉取靶场 2、漏洞特征 404特征Weblogic常用端口:7001 3、漏洞利用…...
element-ui el-table 滚动到底部,进行加载下一页
使用element-ui 自带的InfiniteScroll 无限滚动组件无法使用在table里面,所以项目只能组件写一个 俺的方法是写了一个自定义组件,进行监听滚动条是否拉到最底部进行一个处理。方法如下 直接复制完事了, loadTableMore: { bind(el, binding…...
线性代数的学习和整理19,特征值,特征向量,以及引入的正交化矩阵概念(草稿)
目录 1 什么是特征值和特征向量? 1.1 特征值和特征向量这2个概念先放后 1.2 直观定义 1.3 严格定义 2 如何求特征值和特征向量 2.1 方法1:结合图形看,直观方法求 2.1.1 单位矩阵的特征值和特征向量 2.1.2 旋转矩阵 2.2 根据严格定义…...
初步了解android如何锁键
百年三万六千日,光阴只有瞬息间。 手机下面的三个图形,正方形,园形,三角形分别的什么建?都起到什么功能? 三角形的那个叫返回键,就是可以返回你的上一个操作; 圆形是HOME键,按一下可…...
行业追踪,2023-09-13
自动复盘 2023-09-13 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…...
$nextTick和setTimeout区别(宏任务微任务)
nextTick 在vue 源码中是利用 Promise.resolve()实现的。该问题实际就是Promise与setTimeout的区别,本质是Event Loop中微任务与宏任务的区别。 nextTick:在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。…...
Linux内核及可加载内核模块编程
图1 Linux系统整体结构 图2 Linux的源代码结构 下面显示一段内核模块代码案例: #include <linux/moduLe.h> #include <linux/kernel.h #include <linux/intt.h> /*模块的初始化函数lkp_ init()_init是用于初始化的修饰符 */ static int __init lk…...
软件设计师_备考笔记
考试介绍及考点分布情况 考试要求: (1)掌握数据表示、算术和逻辑运算; (2)掌握相关的应用数学、离散数学的基础知识; (3)掌握计算机体系结构以及各主要部件的性能和基…...
Java学习笔记------抽象类和抽象方法
抽象方法 抽象方法:将共性的行为(方法)抽取到父类之后,由于每一个子类执行的内容是不一样的,所以,在父类中不能确定具体的方法体,该方法就可以定义为抽象方法抽象类:如果一个类中存…...
毕业设计选题指南-25个优质选题
毕业设计是大学生活中的一项重要任务,它不仅代表了您所学知识的应用,还为未来职业道路奠定了基础。然而,许多学生常常陷入选题的困境,不知道如何选择一个合适的毕业设计题目。本文将提供一些建议,帮助您决定一个适合您…...
React使用useImperativeHandle实现父组件触发子组件事件
相关知识: useImperativeHandle forwardRef 相关代码: 获取子组件实例,由于这是函数组件,没有this因此不能整体获取,我们可以通过useImperativeHandle获取想要的变量或者方法。 父组件import React, { useRef } fro…...
【PowerQuery】Excel的PowerQuery的复制
在Excel中构建符合要求的PowerQuery连接之后,所有的PowerQuery 连接已经顺利的保存在Excel 工作簿当中,但是如何去查看已经保存的PowerQuery连接呢?图6.3 显示了查看PowerQuery连接。 Excel界面->数据页签->查询与连接 如果你的Power…...
这个制作企业期刊的神器我怎么没早点发现
和大家分享个好消息,发现这款制作企业期刊的神器特好用 有点后悔早些没发现它,没用过的可以试试,FLBOOK在线制作电子杂志平台 下面教大家一些如何使用FLBOOK的过程 1.打开FLBOOK平台,点击登录与注册 2.点击开始制作,…...
核心实验18_ospf高级_ENSP
项目场景: 核心实验18_ospf高级_ENSP 多区域虚链路 实搭拓扑图: 具体操作: R1: [R1]ospf 1 router-id 1.1.1.1 [R1-ospf-1]area 0 [R1-ospf-1-area-0.0.0.0]net 1.1.1.0 0.0.0.255 [R1-ospf-1-area-0.0.0.0]net 10.1.12.0 0.0.0.255 [R1-os…...
【python零基础入门学习】python基础篇之系统模块调用shell命令执行(四)
本站以分享各种运维经验和运维所需要的技能为主 《python》:python零基础入门学习 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8》暂未更新 《docker学习》暂未更新 《ceph学习》ceph日常问题解…...
用python实现基本数据结构【01/4】
说明 如果需要用到这些知识却没有掌握,则会让人感到沮丧,也可能导致面试被拒。无论是花几天时间“突击”,还是利用零碎的时间持续学习,在数据结构上下点功夫都是值得的。那么Python 中有哪些数据结构呢?列表、字典、集…...
Ubuntu22.04 install Kafka
kafka quickstart install kafka...
实现JSONP请求
同源策略 JavaScript 的浏览器都会使用这个策略。所谓同源是指,域名,协议,端口相同。 而所有非同源的请求(即 域名,协议,端口 其中一种或多种不相同),都会被作为跨域请求。实际上请求…...
网站前置审批办理/sem优化服务公司
亲,戳右上面的蓝字关注我哦!2019 年 2 月 24 日上周末,也就是农历正月二十,在北京西直门附近八位大老爷们来自于祖国四面八方,相聚在一起,虽没有共商国家大事,却也在谈论自己的未来——自己公众…...
政府网站建设自评/大连百度关键词优化
随着软件与硬件的进步,大家应该都能感受到电脑的开机速度变的越来越快,特别是win8和win10系统,这是因为这两种系统都采用了UEFI的启动模式然后搭配gpt分区形式的硬盘,不过这种启动模式的电脑重装系统时稍微麻烦,要先进…...
做seo排名好的网站/餐饮营销方案
注:本文是 年中盘点|2022上半年,CSDN帮用户解决了什么问题 的一部分。 AI小组半年研发分析,思考,回顾。 改进:CSDN 统一标签 标签体系是数据分类的基础之一。我们持续在统一标签上进行改进 重构领域标签…...
做推广比较好的网站有哪些/优化方案官网电子版
HTTP Basic Authentication原来很easy,參考文档:http://zh.wikipedia.org/wiki/HTTP%E5%9F%BA%E6%9C%AC%E8%AE%A4%E8%AF%81将username和password用:分隔,然后用base64编码。最后用HTTP GET方法请求页面以下一小段代码用newLISP调用…...
网站用nodejs做后台/线上推广的方法
声明:此篇文章是个人学习笔记,并非教程,所以内容可能不够严谨。可作参考,但不保证绝对正确。如果你发现我的文章有什么错误,非常欢迎指正,谢谢哦 Rect Transform官方文档:https://docs.unity3d…...
360建筑网密码忘了怎么改?/重庆网页优化seo
文章目录1. 工作介绍2. 程序分解2.1 打开标志图像、调整标志大小2.2 遍历所有文件并打开图像2.3 调整图像的大小2.4 添加标志、保存更改2.5 完整程序3. 类似程序的想法1. 工作介绍 写一个脚本完成这一工作:调整最近抓取的几百张二次元壁纸的大小,并在每…...