【学习笔记】【最全!!】C++ 中 static 关键字的作用
目录前言static 作用在变量上static 作用在全局变量上static 作用在局部变量上static 作用在成员变量上static 作用在函数上static 作用在函数上static 作用在成员函数上static 作用在模板上参考前言在 C/C 中关键字static在不同的应用场景下有不同的作用这里总结一下避免在使用时弄混。我按照以下的逻辑来分类static的作用场景static 作用在变量上static 作用在全局变量上限制全局变量在本文件上static 作用在局部变量上即使离开变量作用域也保存变量值比如用作计数器static 作用在成员变量上 对象间共享该变量static 作用在函数上static 作用在函数上函数可见性限制在本文件中即使函数被声明在头文件引用该头文件的其他cpp文件也无法使用该函数static 作用在成员函数上static 作用在模板上static 作用在变量上static 作用在全局变量上对于普通的全局变量来说同一项目中的其他文件也可访问相同的全局变量若为了限制全局变量在本文件中则需要在这个全局变量上加一个static这样该变量就只能在本文件可见。此外全局变量在程序启动时初始化在 main 之前这使得全局变量的生命周期会到程序结束为止。我们先来演示一下如何在一个文件中使用另一个文件的全局变量。假设有a.cpp和b.cpp我们在b中定义一个全局变量staticValue然后在a中打印出来。// b.cpp// 全局变量intstaticValue10;voidstaticMain(){// ...}// a.cpp#includeiostreamusingnamespacestd;// 必须通过 extern 关键字在整个项目搜索 staticValueexternintstaticValue;intmain(){cout在 a.cpp 中可见staticValueendl;// 在 a.cpp 中可见10}显然我们成功在a文件中使用到了b文件内定义的全局变量。现在我希望将 staticValue 的全局可见性限制在 b 文件内不让其他文件也可以访问于是我在 b 的 staticValue 前加上 static 关键字// b.cpp// 全局变量staticintstaticValue10;voidstaticMain(){// ...}将代码如上修改后当我们再次运行时程序会在链接阶段报错报错信息如下根据描述可见在a的obj文件汇编后生成的对象文件里没有解析到staticValue这个变量达到了我们限制全局变量在本文件内的目的static 作用在局部变量上static 作用在局部变量上即使离开变量作用域也保存变量值。具体的效果就是延长了变量的生命周期比如用作计数器。效果如下面的代码所示可以看到num的值是逐渐累加的过程#includestdio.hvoidcount();intmain(void){inti0;for(i0;i5;i){count();}return0;}voidcount(){/*声明一个静态局部变量*/staticintnum0;num;printf(%d\n,num);// 1 2 3 4 5 6}从编译器的内存分布上讲被static修饰的变量会被保存在数据区中而普通的变量是保存在栈区或者堆区中。而该变量最终在进程终止后结束其生命周期。static 作用在成员变量上在这种情况下static标记的变量可以在多个对象之间共享该变量在底层上因为static标记的变量并非存在于对象的内存空间而是存在于数据区中这涉及到 C 语言的内存布局。具体的效果如下面代码所示我们声明了 3 个学生对象分别是 zhangsanlisi 和 wangwu并在定义他们的时候给他们传入了各自的初始分数最终求得三个人的总分。#includeiostreamusingnamespacestd;classstudent{private:staticintsumScore;intmyScore;public:student(intm):myScore(m){sumScoremyScore;}intgetSumScore(){returnsumScore;}};intstudent::sumScore0;// 静态成员变量必须在类外被初始化intmain(){studentzhangsan(10);studentlisi(20);studentwangwu(30);coutwangwu.getSumScore()endl;// 60return0;}关于 static 在修饰成员变量时的注意事项static修饰的成员变量属于类在对象间共享因此某个对象修改了该变量对其他对象也是可见的静态成员变量的初始化必须要在类外如上面的代码所示静态成员变量的内存分配是发生在类外初始化的时候而不是类或者对象创建的时候静态成员变量可以通过类也可以通过对象来访问但必须遵守访问可见性publicprivate和protectedstatic 作用在函数上static 作用在函数上它起到的效果和 static 作用在全局变量上类似将函数的可见性限制在本文件内。这里我们直接举被 static 修饰的函数的例子。假设在 b.cpp 中我们定义了一个 bMain() 的函数在 b.h 的头文件中进行声明在 a.cpp 中引入这个头文件并调用 bMain()那么是可以正常调用的。现在我们在 b.cpp 中在 bMain() 前加上一个 static 关键字那么 a.cpp 就不能在调用了。// b.cpp#includeiostreamusingnamespacestd;staticvoidbMain(){coutbMainendl;}// b.hppvoidbMain();// a.cpp#includeb.hppintmain(){bMain();return0;}执行上述代码我们可以看到和 “static 作用在全局变量上” 小节类似的报错问题static 作用在成员函数上静态成员函数具有和静态成员变量类似的性质和作用一般可以用这种方式来确定类创建了多少个对象静态成员函数在对象之间共享或者说它独立于对象之外可以通过对象来调用静态成员函数也可以通过类名来调用静态成员函数静态成员函数可以访问静态成员变量或其他静态成员函数但不能使用当前对象指针#includeiostreamusingnamespacestd;classstudent{private:staticintsumObj;public:student(){sumObj1;}staticintgetObjNum(){returnsumObj;}};intstudent::sumObj0;// 静态成员变量必须在类外被初始化intmain(){student zhangsan;student lisi;student wangwu;coutstudent 有几个对象 student::getObjNum()endl;// 3return0;}可以看到最终我们输出了 3 个对象static 作用在模板上这里包括了函数模板和类模板它们的逻辑都是一样的描述当是相同的模板实例时static 修饰的变量在模板间共享当是不同的模板实例时static 修饰的变量独立存在于各个实例中。下面是一个例子#includeiostreamusingnamespacestd;templatetypenameTvoidfun(){staticinti1;coutiendl;return;}intmain(){// 前两个是相同的模板函数funint();// 2funint();// 3// 这是不同的模板函数fundouble();// 2return0;}类模板也是一样的道理#includeiostreamusingnamespacestd;templateclassTclassTest{public:staticintcount;Test(){};~Test(){};voidadd(){count;coutcountendl;}};templateclassTintTestT::count0;intmain(){Testinta;Testintb;Testdoublec;a.add();// 1b.add();// 2c.add();// 1}【注】函数类模板是指的在文件中定义的程序员自己写的模板部分。模板类函数是指在实例化时编译器为我们生成的函数参考《Primer C》Templates and Static variables in C

相关新闻

A/B测试实战避坑指南:3类辛普森悖论与5步实验设计框架

A/B测试实战避坑指南:3类辛普森悖论与5步实验设计框架

A/B测试实战避坑指南:3类辛普森悖论与5步实验设计框架在数据驱动的决策时代,A/B测试已成为企业优化产品、提升转化率的标配工具。但当数据结果与业务直觉相悖时,你可能正遭遇统计学中最狡猾的陷阱——辛普森悖论。本文将从三个真实业务场景切…

2026/7/12 13:48:00 阅读更多 →
Windows系统下局域网git自己使用

Windows系统下局域网git自己使用

文章目录 前言 一、创建远程仓库 二、创建本地仓库 1.初始化Git仓库 2.将文件添加到暂存区 3.提交更改 4.关联远程仓库(重点!!) 5.推送到远程仓库 总结 前言 在一个人或很少人的开发项目中,不使用服务器,…

2026/7/12 13:48:00 阅读更多 →
Fiddler Web Debugger中文版:2025年HTTP/HTTPS流量调试终极指南

Fiddler Web Debugger中文版:2025年HTTP/HTTPS流量调试终极指南

Fiddler Web Debugger中文版:2025年HTTP/HTTPS流量调试终极指南 【免费下载链接】zh-fiddler Fiddler Web Debugger 中文版 项目地址: https://gitcode.com/gh_mirrors/zh/zh-fiddler Fiddler Web Debugger中文版是一款功能强大的网络调试工具,专…

2026/7/12 13:46:00 阅读更多 →

最新新闻

为什么选择Saucer?轻量级C++ Webview库的7大技术优势与性能对比

为什么选择Saucer?轻量级C++ Webview库的7大技术优势与性能对比

为什么选择Saucer?轻量级C Webview库的7大技术优势与性能对比 【免费下载链接】saucer 🛸 A modern, cross-platform C webview library 项目地址: https://gitcode.com/gh_mirrors/sa/saucer 在当今跨平台桌面应用开发领域,选择一个合…

2026/7/12 15:58:41 阅读更多 →
构建MLB数据可视化应用:基于MLB-StatsAPI和Matplotlib的完整指南

构建MLB数据可视化应用:基于MLB-StatsAPI和Matplotlib的完整指南

构建MLB数据可视化应用:基于MLB-StatsAPI和Matplotlib的完整指南 【免费下载链接】MLB-StatsAPI Python wrapper for MLB Stats API 项目地址: https://gitcode.com/gh_mirrors/ml/MLB-StatsAPI MLB-StatsAPI是一个强大的Python包装器,专为轻松访…

2026/7/12 15:58:41 阅读更多 →
Design Compiler 时序约束排错:set_false_path 误用导致的3类时序违例

Design Compiler 时序约束排错:set_false_path 误用导致的3类时序违例

Design Compiler时序约束排错:set_false_path误用引发的三类典型时序违例诊断手册 在数字芯片设计流程中,时序约束文件(SDC)的质量直接影响逻辑综合与物理实现的效率。作为Synopsys Design Compiler的核心约束指令之一&#xff0c…

2026/7/12 15:56:41 阅读更多 →
Gemma-4-12B-it-qat-OptiQ-4bit故障排除:常见问题与解决方案大全 [特殊字符]

Gemma-4-12B-it-qat-OptiQ-4bit故障排除:常见问题与解决方案大全 [特殊字符]

Gemma-4-12B-it-qat-OptiQ-4bit故障排除:常见问题与解决方案大全 🚀 【免费下载链接】gemma-4-12B-it-qat-OptiQ-4bit 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/gemma-4-12B-it-qat-OptiQ-4bit Gemma-4-12B-it-qat-OptiQ-4bi…

2026/7/12 15:54:40 阅读更多 →
生产级 RAG 回答前后矛盾乱答?别乱改 prompt,零代码解决知识库冲突提 20% 准确率附清单

生产级 RAG 回答前后矛盾乱答?别乱改 prompt,零代码解决知识库冲突提 20% 准确率附清单

作者:张钧泽(曌选科技 GEO 优化主理人)🔹 20 生产级 RAG 项目落地经验,专注大模型生成式优化(GEO)、RAG 全链路调优技术RAG 上线是不是经常遇到回答前后矛盾的问题?同一个问题问两次…

2026/7/12 15:54:40 阅读更多 →
SimplexityAI:打造你的AI智能助手桌面版终极指南

SimplexityAI:打造你的AI智能助手桌面版终极指南

SimplexityAI:打造你的AI智能助手桌面版终极指南 【免费下载链接】simplexity-ai-app Community-driven P.... AI desktop app powered by Electron, bringing powerful AI language intelligence straight to your desktop. 项目地址: https://gitcode.com/gh_mi…

2026/7/12 15:52:40 阅读更多 →

日新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/12 0:03:13 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/12 0:03:14 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/12 0:03:14 阅读更多 →

周新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/12 0:03:13 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/12 0:03:14 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/12 0:03:14 阅读更多 →

月新闻