c/c++ static
定义
- 修饰普通变量,修改变量的存储区域和生命周期,使变量存储在静态区,在 main
函数运行前就分配了空间,如果有初始值就用初始值初始化它,如果没有初始值系统用默认值初始化它。 - 修饰普通函数,表明函数的作用范围,仅在定义该函数的文件内才能使用。在多人开发项目时,为了防止与他人命名空间里的函数重名,可以将函数定位为
static。 - 修饰成员变量,修饰成员变量使所有的对象只保存一个该变量,而且不需要生成对象就可以访问该成员。
- 修饰成员函数,修饰成员函数使得不需要生成对象就可以访问该函数,但是在 static 函数内不能访问非静态成员。
作用
- 静态成员变量
静态成员变量是属于类本身的变量,而不是某个具体对象的变量。它只在类中有一份内存拷贝,所有类的对象共享这份内存。
- 静态成员变量存储在静态存储区,而不是对象的内存中。
- 所有对象共享一个静态成员变量的拷贝,无论创建多少个对象。
- 静态成员变量在类外进行定义和初始化,且不能在类内初始化(C++17 之后可以使用 inline 初始化)。
- 静态成员变量在程序开始时分配内存,直到程序结束才释放。 它的生命周期贯穿整个程序运行期间。
- 可以通过类名直接访问,也可以通过对象访问(推荐使用类名访问以强调静态成员的性质)
class MyClass {
public:// 静态成员变量声明static int counter; // 静态成员函数static void Increment() {counter++;}// 获取静态变量值static int GetCounter() {return counter;}
};
使用:// 通过类名访问MyClass::Increment(); // 输出:Counter: 1cout << "Counter: " << MyClass::GetCounter() << endl;// 通过对象访问(不推荐)MyClass obj1;obj1.Increment();// 输出:Counter: 2cout << "Counter: " << MyClass::GetCounter() << endl; MyClass obj2;obj2.Increment();// 输出:Counter: 3cout << "Counter: " << MyClass::GetCounter() << endl;
- 静态成员函数
在 C++ 中,静态成员函数(static member function)是属于类本身而不是某个具体对象的成员函数。它使用 static 关键字进行声明,可以在没有创建类的实例时通过类名直接调用。
class MyClass
{
public:// 使用关键字 static 声明静态成员函数static void print();
};// 在类外定义静态成员函数时,不需要再次使用 static 关键字:
void MyClass::print() {std::cout << "This is a static member function." << std::endl;
}调用:静态成员函数可以通过类名或对象调用,但推荐通过类名调用// 通过类名调用MyClass::print(); // 通过对象调用MyClass obj;obj.print();
- 静态全局变量
使用 static 修饰的全局变量,只可以使其在声明所在的文件内可见,这样可以避免与其他文件中相同名称的变量产生冲突
static int globalCount;
- 静态普通函数
需要 static 修饰的函数成为静态函数,这种函数只能在声明所在的文件内部调用,无法被其他文件直接调用,这对一些 辅助函数或者实用函数,限制在特定的文件范围内非常有用
static int add(const int& a,const int & b)
{return a + b;
}
- 静态局部变量
在一个函数内部使用 static 的变量,称为局部静态变量,与普通的局部变量不同,局部静态变量在函数调用结束后不会被销毁而是保持其值与存在。
如果你想重复使用一个变量由不想将它声明为全局变量,就可以将它声明为静态局部变量
int getCount()
{static int count = 0;count++;return count;
}
逆向 C++ static
class MyClass {public:MyClass(){number = 0x111111;counter = 0x222222;}public:static int counter;int number;void printNumber(){std::cout << number << std::endl;}static void printCounter(){std::cout << counter << std::endl;}
}
调用:
MyClass obj;
进入构造函数:
00007FF6A94610B3 | 48:8D4C24 20 | lea rcx,qword ptr ss:[rsp+20]
;public: __cdecl MyClass::MyClass(void)
00007FF6A94610B8 | E8 43FFFFFF |call 0x00007FF6A9461000 构造函数中看 静态成员变量 counter 和 成员变量 number 00007FF6A9461000 <te | 48:894C24 08 | mov qword ptr ss:[rsp+8],rcx
00007FF6A9461005 | 48:8B4424 08 | mov rax,qword ptr ss:[rsp+8]
; 成员变量number 赋值
00007FF6A946100A | C700 11111100 | mov dword ptr ds:[rax],111111
; static int MyClass::counter 静态成员变量赋值:
00007FF6A9461010 | C705 1A360000 22222200 | mov dword ptr ds:[0x00007FF6A9464634], 0x222222
00007FF6A946101A | 48:8B4424 08 | mov rax,qword ptr ss:[rsp+8]
00007FF6A946101F | C3 | ret 成员函数调用:
obj.printNumber();
00007FF6A94610BD | 48:8D4C24 20 | lea rcx,qword ptr ss:[rsp+20]
; void __cdecl MyClass::printNumber(void)
00007FF6A94610C2 | E8 59FFFFFF | call 0x00007FF6A9461020-------------------- printNumber --------------------
00007FF6A9461020 <te | 48:894C24 08 | mov qword ptr ss:[rsp+8],rcx
00007FF6A9461025 | 48:83EC 28 | sub rsp,28
00007FF6A9461029 | 48:8B4424 30 | mov rax,qword ptr ss:[rsp+30]
; edx = number = 0x11111
00007FF6A946102E | 8B10 | mov edx,dword ptr ds:[rax]
; 下面是调用 std::cout 打印输出
00007FF6A9461030 | 48:8B0D 69100000 | mov rcx, qword ptr ds:[0x00007FF6A94620A0]
00007FF6A9461037 | FF15 6B100000 | call qword ptr ds:[0x00007FF6A94620A8]
00007FF6A946103D | 48:8D15 9C000000 | lea rdx, ds:[0x00007FF6A94610E0]
00007FF6A9461044 | 48:8BC8 | mov rcx,rax
00007FF6A9461047 | FF15 33100000 | call qword ptr ds:[0x00007FF6A9462080]
00007FF6A946104D | 48:83C4 28 | add rsp,28
00007FF6A9461051 | C3 | ret 静态成员函数调用:obj.printCounter();call 0x00007FF6A9461060-------------------- printCounter --------------------
00007FF6A9461060 <te | 48:83EC 28 | sub rsp,28
; 静态成员变量 edx = 0x222222
00007FF6A9461064 | 8B15 CA350000 | mov edx, dword ptr ds:[0x00007FF6A9464634]
; std::cout 输出
00007FF6A946106A | 48:8B0D 2F100000 | mov rcx, qword ptr ds:[0x00007FF6A94620A0]
00007FF6A9461071 | FF15 31100000 | call qword ptr ds:[0x00007FF6A94620A8]
00007FF6A9461077 | 48:8D15 62000000 | lea rdx, ds:[0x00007FF6A94610E0]
00007FF6A946107E | 48:8BC8 | mov rcx,rax
00007FF6A9461081 | FF15 F90F0000 | call qword ptr ds:[0x00007FF6A9462080]
00007FF6A9461087 | 48:83C4 28 | add rsp,28
00007FF6A946108B | C3 | ret
相关文章:
c/c++ static
定义 修饰普通变量,修改变量的存储区域和生命周期,使变量存储在静态区,在 main 函数运行前就分配了空间,如果有初始值就用初始值初始化它,如果没有初始值系统用默认值初始化它。修饰普通函数,表明函数的作…...
C#中System.Text.Json:从入门到精通的实用指南
一、引言 在当今数字化时代,数据的高效交换与处理成为软件开发的核心环节。JSON(JavaScript Object Notation)凭借其简洁、轻量且易于读写的特性,已然成为数据交换领域的中流砥柱。无论是前后端数据交互,还是配置文件…...
内存故障原因与诊断(Reasons and Diagnosis of Memory Failure)
内存故障原因与诊断 您是否曾遇到过电脑无法启动、黑屏、死机,或者系统卡顿的情况?这些问题看起来很复杂,实际上大多数都是内存故障引起的。内存是电脑的核心组成部分之一,任何小东西问题都可能导致系统死机,严重时甚…...
[操作系统] 进程状态详解
在操作系统中,进程是程序执行的基本单位,操作系统负责管理进程的生命周期。为了高效地管理进程,操作系统通过定义不同的进程状态来表示进程在不同时间点的行为。本文将详细介绍常见的进程状态及其相互之间的转换过程。 进程状态概述 在kerne…...
[论文阅读] (36)CS22 MPSAutodetect:基于自编码器的恶意Powershell脚本检测模型
《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座,并分享给大家,希望您喜欢。由于作者的英文水平和学术能力不高,需要不断提升,所以还请大家批评指正,非常欢迎大家给我留言评论,学术路上期…...
【Maui】下拉框的实现,绑定键值对
文章目录 前言一、问题描述二、解决方案三、软件开发(源码)3.1 创建模型3.2 视图界面3.3 控制器逻辑层 四、项目展示 前言 .NET 多平台应用 UI (.NET MA…...
Oracle 深入学习 Part 14:Managing Password Security and Resources(管理密码安全性和资源)
Profiles Profile 是一个以名称标识的集合,用于管理 密码 和 资源限制。 每个用户都对应一个profiles,可以通过 CREATE USER 或 ALTER USER 命令分配给用户。 Profiles 可以启用或禁用。 Profiles 可以关联到默认的 DEFAULT Profile。 密码管理&…...
C语言:位段
位段的内存分配: 1. 位段的成员可以是 int unsigned int signed int 或者是char (属于整形家族)类型 2. 位段的空间上是按照需要以4个字节( 类型 int )或者1个字节( char )的方式来开辟的。 3. 位段涉及…...
MPLS VPN 原理与配置
一.简介 MPLS,称之为多协议标签交换,在九十年代中期被提出来,用于解决传统IP报文依赖查表转发而产生的瓶颈,现多用于VPN技术,MPLS报头封装在数据链路层之上,网络层之下。本文为结合了华为技术和新华三技术…...
稳定的通信桥梁,CCLINKIE转ModbusTCP网关实现AGV运输的光速效应
三菱PLC与AGV机器人搬运车通过稳联技术协议转换网关建立通信 一、现场情况概述 - 三菱PLC:使用CC-Link IE协议进行通信。 - AGV机器人搬运车:使用Modbus TCP协议进行通信。 - 协议转换网关:使用稳联技术的协议转换网关将PLC和AGV连接…...
Leetcode 3428. Maximum and Minimum Sums of at Most Size K Subsequences
Leetcode 3428. Maximum and Minimum Sums of at Most Size K Subsequences 1. 解题思路2. 代码实现 题目链接:3428. Maximum and Minimum Sums of at Most Size K Subsequences 1. 解题思路 这一题不需要连续性,因此我们就是考虑取得子串长度为别为1…...
第2章:Python TDD构建Dollar类基础
写在前面 这本书是我们老板推荐过的,我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后,我突然思考,对于测试开发工程师来说,什么才更有价值呢?如何让 AI 工具更好地辅助自己写代码,或许…...
【算法学习笔记】34:扩展欧几里得算法
裴蜀定理 描述 对于任意正整数 a a a、 b b b,一定存在整数系数 x x x, y y y,使得: a x b y g c d ( a , b ) ax by gcd(a, b) axbygcd(a,b) 并且 g c d ( a , b ) gcd(a, b) gcd(a,b)是对于任意的系数 x x x和 y y y放在…...
云原生周刊:K8s 生产环境架构设计及成本分析
开源项目推荐 KubeZoneNet KubeZoneNet 旨在帮助监控和优化 Kubernetes 集群中的跨可用区(Cross-Zone)网络流量。这个项目提供了一种简便的方式来跟踪和分析 Kubernetes 集群中跨不同可用区的通信,帮助用户优化集群的网络架构、提高资源利用…...
WGAN - 瓦萨斯坦生成对抗网络
1. 背景与问题 生成对抗网络(Generative Adversarial Networks, GANs)是由Ian Goodfellow等人于2014年提出的一种深度学习模型。它包括两个主要部分:生成器(Generator)和判别器(Discriminator)…...
海量数据的处理
一般来说都是针对数据量特别大,内存有限制的。 第一类:topk问题 比如,在海量数据中找前50大的数据怎么办? 方法一:使用小顶堆,用小顶堆维护这50个元素,当有新元素到来时,直接与堆…...
区块链的数学基础:核心原理与应用解析
引言 区块链技术作为分布式账本系统,成功地解决了传统中心化系统中的信任问题。其背后隐藏着复杂而精妙的数学原理,包括密码学、哈希函数、数字签名、椭圆曲线、零知识证明等。这些数学工具不仅为区块链提供了安全保障,也为智能合约和去中心…...
1.5 GPT 模型家族全解析:从 GPT-1 到 GPT-4 的演进与创新
GPT 模型家族全解析:从 GPT-1 到 GPT-4 的演进与创新 随着人工智能技术的飞速发展,GPT(Generative Pre-trained Transformer)模型家族已经成为了现代自然语言处理(NLP)领域的标杆。从初代的 GPT-1 到最新的 GPT-4,每一代模型的发布都标志着人工智能技术的一个飞跃,并推…...
自动驾驶之DriveMM: All-in-One Large Multimodal Model for Autonomous Driving
1. 写在前面 工作之后,主要从事于偏工程比较多的内容, 很少有机会读论文了,但2025年,由于之前有些算法的背景, 后面可能会接触一些多模态大模型相关的工作,所以又调头有点往算法的方向偏移, 而算法呢,很重要的一点就是阅读论文。2025年,再拾起论文这块的工作。 今天…...
Spring Boot 配置(官网文档解读)
目录 摘要 Spring Boot 配置加载顺序 配置文件加载顺序 Spring Boot 配置加载方式 Value Value 注解简单示例 ConfigurationProperties 启动 ConfigurationProperties ConfigurationProperties 验证 ConfigurationProperties 与 Value 对比 Autowired Autowired 自…...
AI Coding越来越强,我们还有必要学Processing吗? · 创意编程运
故障表现 发现请求集群 demo 入口时卡住,并且对应 Pod 没有新的日志输出 rootce-demo-1:~# kubectl get pods -n deepflow-otel-spring-demo -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NO…...
文献综述与波普尔语境的形成:从 “伪神” 到 “补锅匠” 的逻辑坍缩史
文献综述与波普尔语境的形成:从 “伪神” 到 “补锅匠” 的逻辑坍缩史摘要本文系统批判20世纪科学哲学“三座丰碑”——波普尔、库恩、拉卡托斯及费耶阿本德,揭示其理论演进实为从逻辑诈骗到社会学强辩、再到官僚式和稀泥的堕落三部曲。波普尔以“可证伪…...
[App逆向]环境搭建下篇 — — 逆向源码+hook实战
[App逆向]环境搭建下篇——逆向源码hook 上篇:[App逆向]环境搭建上篇——抓取apk https包 免责声明:本教程仅供技术学习和安全研究使用,禁止用于任何非法用途。逆向他人 App 前请获得授权。 环境搭建 1. 安装jadx——逆向代码 1.安装jadx …...
Pretext:值得关注的文本排版引擎涎
一、语言特性:Java 26 与模式匹配进化 1.1 Java 26 语言级别支持 IDEA 2026.1 EAP 最引人注目的变化之一,就是新增 Java 26 语言级别支持。这意味着开发者可以提前体验和测试即将在 JDK 26 中正式发布的语言特性。 其中最重要的变化是对 JEP 530 的全面支…...
Carsim与Simulink联合仿真模型——AEB的cpar文件、simulink模型文件及...
Carsim与Simulink联合仿真模型——AEB 提供cpar文件,simulink模型文件,模型搭建过程文档在汽车开发领域,安全系统始终占据着举足轻重的地位。其中,主动安全辅助系统(AEB)作为现代汽车的安全核心,…...
Git-Sim终极调试指南:快速解决常见错误与性能优化技巧
Git-Sim终极调试指南:快速解决常见错误与性能优化技巧 【免费下载链接】git-sim Visually simulate Git operations in your own repos with a single terminal command. 项目地址: https://gitcode.com/gh_mirrors/gi/git-sim Git-Sim是一款强大的Git操作可…...
网络自动重连工具:告别频繁断网烦恼的终极解决方案
网络自动重连工具:告别频繁断网烦恼的终极解决方案 【免费下载链接】BIT-srun-login-script 北京理工大学深澜校园网登录脚本,以实现命令行登录或者断线重连等,仅提供登录功能 项目地址: https://gitcode.com/gh_mirrors/bi/BIT-srun-login…...
OpenClaw 保姆级安装指南:从下载到运行,一次成功避坑全解
2026年爆火的开源数字员工OpenClaw(小龙虾),凭本地运行、零代码操作、自动执行任务的优势圈粉无数。它不是普通聊天AI,能直接操控电脑,接收自然语言指令后自动拆解任务,全程无需人工干预。 本文专为CSDN全…...
英飞凌功率MOSFET SPICE模型在TINA中的热仿真与参数优化指南
1. 为什么需要功率MOSFET热仿真? 做电源设计的朋友应该都深有体会,功率MOSFET的发热问题就像个甩不掉的"小尾巴"。我去年做一个48V转12V的DC-DC项目时,就遇到过MOSFET莫名其妙烧毁的情况。后来用热成像仪一看,才发现某个…...
算法基础应用精讲【深度学习】-基于深度学习的多Agent入侵检测系统(理论篇)
目录 第一章 引言 1.1 研究背景与意义 1.2 研究现状 1.3 研究目标与主要贡献 1.4 论文(文档)结构 第二章 核心理论基础 2.1 多Agent系统(MAS)理论 2.1.1 多Agent系统的定义与核心特征 2.1.2 多Agent系统在入侵检测中的应用优势 2.2 深度学习核心算法理论 2.2.1 自…...
