C++中的static(静态)
2014年1月19日 内容整理自The Cherno:C++系列
2014年1月20日 内容整理自《程序设计教程:用C++语言编程 第三版》 陈家骏 郑滔
---------------------------------------------------------------------------------------------------------------------------------
static关键字在C++中有2个意思,这取决于上下文
- 1.在类或者结构体的外部使用static关键字
- 2.在类或者结构体内部使用static关键字
简而言之:
1.类或结构体外部的static,意味着你声明为static的符号将只能对你定义它的翻译单元可见
2.而类或结构体内部的静态变量static,意味着这个变量将于所有类的实例共享内存,这意味着该静态变量在你在类中创建的所有实例中。有时,同一个类的不同对象需要共享数据,如果使用全局变量来表示共享的数据,则缺乏对数据的保护。
---------------------------------------------------------------------------------------------------------------------------------
1.在类或者结构体的外部使用static关键字
现在我们集中研究在类或结构体外部的static变量

//在具有如下两个文件main.cpp和Static.cpp的情况下运行代码,没有报错

然而,让我们在Static.cpp中删除关键字static,再次运行报错,原因是多重定义了全局变量s_Variable
so,我们不可以在同一个项目中有两个同名的全局变量-
尝试1:extern关键字

尝试2:static关键字
在某个.cpp文件中将变量声明为static,可以类比于在类中声明一个private的变量,其他的所有翻译单元都不能看到这个s_variable变量,the linker will not see this in a global scope 
尝试在Static.cpp中定义一个函数试试 ,仍显示重复定义
尝试将Static.cpp中的function(){}函数标记为static的,点击运行,就不会报错了

如果你想在头文件中声明一个静态变量,并将该头文件包含在两个不同的C++文件中,这就相当于在两个文件中都声明了相同的静态变量
---------------------------------------------------------------------------------------------------------------------------------
2.在类或者结构体的内部使用static关键字
在C++中,采用类的静态成员(static member)来解决同一个类的对象共享数据的问题,与普通数据成员不同的是,类定义中的静态数据成员对于该类的所有对象只存在一个拷贝,当通过一个对象改变了静态数据成员的值时,通过同类的其他对象可以看到这个修改。
类的静态成员分为:
- 类的静态数据成员(static data)
- 类的静态成员函数(static function)
类定义内部声明静态数据成员,而静态的数据成员往往需要在类的外部定义并初始化:

访问类的静态成员的方式有两种:
- 通过对象访问,格式如上述object.Sum()
- 通过类名访问,格式如上述A::Share
如果你把static和变量一起使用,这意味着在类的所有实例中,这个变量都只有一个实例
如果我创建一个名为Entity的类,我不断创建Entity的实例,我仍然只会得到那个变量的一个版本
意思是如果某个实例改变了这个静态变量----在这个类中的所有实例都会反映这个变化。
so,通过类的实例来引用静态变量是没有意义的。
示例1:

在上述代码中将x,y变成静态的 ,main函数中的初始化就会失败,因为x和y不再是类成员
解决方案:定义x和y

//这里有点乱了,下次回来改
书上例题
---------------------------------------------------------------------------------------------------------------------------------
#include<iostream> //P233例题 /*实现对某类的对象的计数:* 我们有时需要在程序执行的某个时刻知道创建了多少个某类对象(还未消亡)* 为了实现这个功能,我们可以在类中定义一个静态数据成员,每创建一个类的对象,就在构造函数中把该静态数据成员的值加1* 每撤销一个该类的对象就在析构函数中把该静态数据成员的值减1* 在程序运行的任何时刻,通过该静态数据成员,我们就可以知道某时刻该类的对象的个数*/ //note:struct和class的书写格式都是直接花括号 class A{static int Obj_count; public:A(){Obj_count++;}//构造函数、(这里我还没有学到)A(const A& a){Obj_count++;}~A(){Obj_count--;}//析构函数//类中还定义了一个静态成员函数,用于获得创建的A类对象数目static int Get_Num_Of_Objects(){return Obj_count;} };//class A int A::Obj_count=0;//static变量被初始化为0int main(){A arr[10];//每一个数组元素都是一个A 类for(int i=0;i<10;i++){A arr[i];}std::cout<<"It's 4:34 ,2024/1/20,the number of class A's objects is:"<<A::Get_Num_Of_Objects()<<std::endl;A object;std::cout<<"It's 4:34 ,2024/1/20,the number of class A's objects is:"<<A::Get_Num_Of_Objects()<<std::endl;}
---------------------------------------------------------------------------------------------------------------------------------
运行结果:

相关文章:
C++中的static(静态)
2014年1月19日 内容整理自The Cherno:C系列 2014年1月20日 内容整理自《程序设计教程:用C语言编程 第三版》 陈家骏 郑滔 -----------------------------------------------------------------------------------------------------------------------------…...
常见框架漏洞
1.什么是框架 Web框架(Web framework)或者叫做Web应用框架(Web application framework),是用于进行Web开发的一套软件架构。大多数的Web框架提供了一套开发和部署网站的方式。为Web的行为提供了一套支持的方法。使用Web框架,很多的业务逻辑外的功能不需…...
Python文件自动化处理
os模块 Python标准库和操作系统有关的操作创建、移动、复制文件和文件夹文件路径和名称处理 路径的操作 获取当前Python程序运行路径不同操作系统之间路径的表示方式 windows中采用反斜杠(\)作为文件夹之间的分隔符 Mac和Linux中采用斜杠(/)作为文件夹之间的分隔符 把文件…...
js变量提升
js变量提升 在JavaScript中,变量提升(Hoisting)是一种特殊的语法行为,它允许变量和函数声明在它们实际出现之前被JavaScript引擎识别。这意味着,当你在代码的后面部分使用一个变量或函数时,JavaScript引擎…...
C++ 设计模式之策略模式
【声明】本题目来源于卡码网(题目页面 (kamacoder.com)) 【提示:如果不想看文字介绍,可以直接跳转到C编码部分】 【设计模式大纲】 【简介】什么是策略模式(第14种模式) 策略模式是⼀种⾏为型设计模式&…...
(202401)深度强化学习基础2:策略梯度
文章目录 前言策略梯度1 基于价值算法的缺点2 策略梯度算法3 REINFORCE算法本章小结 前言 感谢Datawhale成员的开源本次学习内容的文档地址为 第九章 策略梯度 策略梯度 这个章节会开始介绍基于策略梯度的算法。前面的算法都是针对“奖励”或者说“回报(reward&a…...
bgp大AS小AS选路-联邦ebgp选路
效果图:R1 ping 通 R8 环回 R4的bgp路由表中5.5.5.5通过修改起源属性,下一跳R7变为R2, 即原本走下面R4-R7-R6-R5,改成R4-R3-R2-R5 R5效果图和R4类似(不放了),R5的bgp路由表中4.4.4.4下一跳从R2优先改为R7优先(即原本走上面路R4-R3-R2-R5,改成下面路R4-R7-R6-R5),通…...
beego API 自动化文档
API 全局设置 必须设置在 routers/router.go 中,文件的注释,最顶部: // APIVersion 1.0.0 // Title mobile API // Description mobile has every tool to get any job done, so codename for the new mobile APIs. // Contact astaxiegmai…...
百度搜索Push个性化:新的突破
作者 | 通用搜索产品研发组 导读 本文简单介绍了百度搜索Push个性化的发展过程,揭示了面临的困境和挑战:如何筛选优质物料、如何对用户精准推荐等。我们实施了一系列策略方法进行突破,提出核心的解决思路和切实可行的落地方案。提升了搜索DAU…...
【Oracle】ORA-32017和ORA-00384错误处理
文章目录 【Oracle】ORA-32017和ORA-00384错误处理问题描述问题原因和解决测试验证 【声明】文章仅供学习交流,观点代表个人,与任何公司无关。 编辑|SQL和数据库技术(ID:SQLplusDB) 收集Oracle数据库内存相关的信息 【Oracle】ORA-32017和ORA-00384错误…...
MySQL三大日志
1. redo log 1.1 特点 InnoDB存储引擎独有物理日志,记录在数据页上做的修改让MySQL拥有了崩溃恢复能力,保证事务的持久性 1.2 刷盘时机 事务提交时log buffer 空间使用大约一半时事务日志缓冲区满InnoDB 定期执行检查点Checkpoint后台刷新线程&#…...
力扣每日一练(24-1-20)
大脑里的第一想法是排列组合,直接给出超级准确的最优解。 但不适用,hhh 只要连续的n个元素大于或者等于target就可以了 题目比自己想象的要好解决 解法是使用滑动窗口算法。这个算法的基本思想是维护一个窗口,使得窗口内的元素总和大于等于目…...
Pytest系列(2) - assert断言详细使用
前言 与unittest不同,pytest使用的是python自带的assert关键字来进行断言assert关键字后面可以接一个表达式,只要表达式的最终结果为True,那么断言通过,用例执行成功,否则用例执行失败 assert小栗子 想在抛出异常之…...
CodeWave智能开发平台--03--目标:应用创建--10初级采购管理系统总结
摘要 本文是网易数帆CodeWave智能开发平台系列的第14篇,主要介绍了基于CodeWave平台文档的新手入门进行学习,实现一个完整的应用,本文主要完成10初级采购管理系统总结 CodeWave智能开发平台的14次接触 CodeWave参考资源 网易数帆CodeWave…...
外包干了4个月,技术退步明显.......
先说一下自己的情况,大专生,18年通过校招进入武汉某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…...
图片批量建码怎么用?每张图片快速生成二维码
当我们需要给每个人分别下发对应的个人证件类图片信息,比如制作工牌、荣誉展示或者负责人信息展示时,现在都开始使用二维码的方法来展示员工信息。那么如何快速将每个人员的信息图片分别制作成二维码图片呢,最简单的方法就是使用图片批量建码…...
时间复杂度的排序
在计算机科学中,不同的算法有不同的时间复杂度。以下是一些常见的时间复杂度,并按照它们的增长速度从低到高排序: O(1) - 常数时间复杂度: 表示算法的执行时间是固定的,不随输入规模的增加而变化。例如,直接…...
js控制浏览器前进、后退、页面跳转
在JavaScript中,你可以使用 window 对象的 history 对象来控制浏览器的历史记录。以下是一些常用的方法: 前进和后退: window.history.forward(): 前进到历史记录中的下一个页面。window.history.back(): 返回历史记录中的上一个页面。window…...
【长文阅读】MAMBA作者博士论文<MODELING SEQUENCES WITH STRUCTURED STATE SPACES>-Chapter1
Gu A. Modeling Sequences with Structured State Spaces[D]. Stanford University, 2023. 本文是MAMBA作者的博士毕业论文,为了理清楚MAMBA专门花时间拜读这篇长达330页的博士论文,由于知识水平有限,只能尽自己所能概述记录,并适…...
Unity3D学习之UI系统——GUI
文章目录 1. 前言2. 工作原理和主要作用3. 基础控件3.1 重要参数及文本和按钮3.1.1 GUI 共同点3.1.2 文本控件3.1.3 按钮控件 3.2 多选框和单选框3.2.1 多选框3.2.2 单选框3.2.3 输入框3.2.4 拖动条 3.3 图片绘制和框3.3.1 图片3.3.2 框绘制 4 工具栏和选择网格4.1 工具栏4.2 选…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
若依登录用户名和密码加密
/*** 获取公钥:前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...
