c++ static关键字的详细用法和作用
一.前言在讲static之前先明确两个关键术语· 生命周期变量从创建到销毁的时间段全局变量生命周期是整个程序运行期局部变量是所在函数执行期· 作用域变量 / 函数能被访问的范围全局作用域 整个程序局部作用域 函数 / 代码块内类作用域 类内部。static的核心作用就是延长生命周期、缩小作用域不同场景下侧重点不同。二.static 的 4 个核心使用场景按常用度排序场景 1修饰局部变量函数内的 static 变量作用生命周期从 “函数执行期” 变为 “整个程序运行期”只初始化 1 次程序结束才销毁作用域仍局限在所在函数内外部无法访问。代码示例最经典的计数器#include iostream using namespace std; void countCall() { // static局部变量只初始化1次下次调用直接用上次的值 static int count 0; count; cout 函数被调用了 count 次 endl; } int main() { countCall(); // 输出函数被调用了1次 countCall(); // 输出函数被调用了2次 countCall(); // 输出函数被调用了3次 return 0; }关键说明如果去掉staticcount每次调用都会重置为 0输出永远是 1static局部变量的初始化在程序启动时完成而非函数第一次调用时且只执行 1 次存储位置从 “栈区” 移到 “静态存储区”全局变量也存在这里。场景 2修饰全局变量 / 函数文件级的 static作用作用域从 “整个程序所有源文件” 缩小为 “当前源文件”其他文件无法访问生命周期仍为整个程序运行期无变化。为什么需要全局变量 / 函数默认是 “外部链接”extern其他源文件通过extern就能访问容易导致命名冲突static把它变成 “内部链接”仅限当前文件使用避免冲突。代码示例// file1.cpp #include iostream using namespace std; // static全局变量仅限file1.cpp访问 static int global_num 100; // static函数仅限file1.cpp访问 static void printNum() { cout global_num: global_num endl; } void test() { printNum(); // 合法同一文件内可访问 }// file2.cpp #include iostream using namespace std; // 错误无法访问file1.cpp中的static全局变量 extern int global_num; // 错误无法访问file1.cpp中的static函数 extern void printNum(); int main() { // 编译报错undefined reference to global_num cout global_num endl; // 编译报错undefined reference to printNum() printNum(); return 0; }场景 3修饰类的成员变量静态成员变量作用属于类本身而非类的某个对象所有对象共享同一个静态成员变量生命周期整个程序运行期必须在类外初始化因为不属于任何对象不能在构造函数里初始化。代码示例#include iostream using namespace std; class Student { public: // 静态成员变量统计学生总数所有对象共享 static int total_num; string name; // 构造函数创建对象时总数1 Student(string n) : name(n) { total_num; } }; // 静态成员变量必须在类外初始化关键 int Student::total_num 0; int main() { Student s1(张三); Student s2(李四); Student s3(王五); // 两种访问方式类名::变量 或 对象.变量推荐用类名 cout 学生总数 Student::total_num endl; // 输出3 cout s1对应的总数 s1.total_num endl; // 输出3 return 0; }场景 4修饰类的成员函数静态成员函数作用属于类本身而非对象只能访问静态成员变量 / 函数不能访问非静态成员因为没有 this 指针可以直接通过 “类名函数名” 调用无需创建对象。代码示例#include iostream using namespace std; class Student { public: static int total_num; // 静态成员变量 string name; Student(string n) : name(n) { total_num; } // 静态成员函数获取学生总数只能访问静态成员 static int getTotalNum() { // 错误不能访问非静态成员name没有this指针 // cout name endl; return total_num; } }; int Student::total_num 0; // 初始化静态成员变量 int main() { // 无需创建对象直接通过类名调用静态函数 cout 初始总数 Student::getTotalNum() endl; // 输出0 Student s1(张三); // 也可以通过对象调用不推荐 cout 当前总数 s1.getTotalNum() endl; // 输出1 return 0; }

相关新闻

散热器产业的下一步:从“金属件”到“系统级热管理模块”的结构升级

散热器产业的下一步:从“金属件”到“系统级热管理模块”的结构升级

观点 如果只把散热器理解为一个“金属散热件”,就很难看懂这个行业的下一步。真正发生变化的并不是散热器本身,而是电子系统的功率密度曲线正在陡峭上升: AI服务器、功率半导体、电动汽车电驱系统、5G通信设备——这些系统正在把热管理从“配…

2026/5/17 11:56:59 阅读更多 →
PPT Timer:一个置顶于PPT全屏放映之上的LCD倒计时器

PPT Timer:一个置顶于PPT全屏放映之上的LCD倒计时器

演讲超时?课堂拖堂?用一个赛博朋克风格的桌面倒计时器,帮你精准掌控每一分钟。 痛点 讲PPT的时候,你大概率遇到过这些场景: 答辩给了8分钟,讲到一半才发现已经过了6分钟手机计时器被PPT全屏挡住&#xff…

2026/5/17 11:56:58 阅读更多 →
有源电力滤波器APF:从方案到代码实现的精彩之旅

有源电力滤波器APF:从方案到代码实现的精彩之旅

APf/SVG方案,3dsp结构I型结构,带三相四线和三相三线制,三电平结构,锁相环,电流/电压双环控制,输出Spwm和SVPwm的都已完成测试成功,电流环为PI重复控制器。28335控制器 有源电力滤波器APF程序源代…

2026/5/17 11:56:58 阅读更多 →

最新新闻

FPGA开发新手福音!Vitis-HLS-Introductory-Examples带你轻松入门硬件加速

FPGA开发新手福音!Vitis-HLS-Introductory-Examples带你轻松入门硬件加速

FPGA开发新手福音!Vitis-HLS-Introductory-Examples带你轻松入门硬件加速 【免费下载链接】Vitis-HLS-Introductory-Examples 项目地址: https://gitcode.com/gh_mirrors/vi/Vitis-HLS-Introductory-Examples Vitis-HLS-Introductory-Examples是一套面向FPG…

2026/7/5 20:50:27 阅读更多 →
NVIDIA Jetson 环境安装指导 PyTorch | Conda | cudnn | docker

NVIDIA Jetson 环境安装指导 PyTorch | Conda | cudnn | docker

本文适用于Jetson Nano、TX1/TX2、Xavier 和 Orin系列的设备,供大家参考。 1、PyTorch不同版本安装 这里适用于Jetson Nano、TX1/TX2、Xavier 和 Orin ,需要JetPack 4.2以上。 下载地址:PyTorch for Jetson - Jetson & Embedded System…

2026/7/5 20:48:26 阅读更多 →
FFBox:免费智能多媒体转码工具箱,让视频处理变简单

FFBox:免费智能多媒体转码工具箱,让视频处理变简单

FFBox:免费智能多媒体转码工具箱,让视频处理变简单 【免费下载链接】FFBox 一个多媒体转码百宝箱 / 一个 FFmpeg 的套壳 项目地址: https://gitcode.com/gh_mirrors/ff/FFBox 你是否曾因复杂的FFmpeg命令行而头疼?是否想要一个既专业又…

2026/7/5 20:46:25 阅读更多 →
Win11Debloat终极指南:3步告别Windows卡顿,免费提升50%系统性能

Win11Debloat终极指南:3步告别Windows卡顿,免费提升50%系统性能

Win11Debloat终极指南:3步告别Windows卡顿,免费提升50%系统性能 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes…

2026/7/5 20:46:25 阅读更多 →
如何用WeChatMsg重新定义个人数据主权:3个颠覆性实践路径

如何用WeChatMsg重新定义个人数据主权:3个颠覆性实践路径

如何用WeChatMsg重新定义个人数据主权:3个颠覆性实践路径 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/We…

2026/7/5 20:44:25 阅读更多 →
沉浸式国际象棋体验:如何用音效系统让每一步棋都充满戏剧感

沉浸式国际象棋体验:如何用音效系统让每一步棋都充满戏剧感

沉浸式国际象棋体验:如何用音效系统让每一步棋都充满戏剧感 【免费下载链接】chess A multiplayer chess platform 项目地址: https://gitcode.com/GitHub_Trending/ch/chess 想象一下这样的场景:深夜的在线国际象棋对局中,你精心策划…

2026/7/5 20:40:24 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻