当前位置: 首页 > news >正文

【C++】003、static关键字

一、static关键字的作用

  • 主要有两方面的作用:改变生命周期,和改变链接属性的作用域

二、static关键字四个使用场景

1、局部静态变量(在函数内部)

  • 本质:变量的生命周期从栈变成全局静态存储区,但作用域仍局限于函数内部

  • 特点:局部静态变量只能被初始化一次,之后函数调用结束该变量也不会被销毁,下次调用该函数,获取的还是上次的值

  • 线程安全:从C++11起,局部静态变量的初始化是线程安全的。因为底层编译器会自动加锁,这也是单例模式的底层实现原理

  • 代码实现:

void counter() { static int count = 0; // 只初始化一次,线程安全(C++11起) count++; cout << count << endl; } // 调用3次输出:1, 2, 3

2、全局静态变量/函数(文件作用域)

  • 本质:全局静态变量和函数在当前文件中都可以调用,而其他cpp文件无法调用该变量或函数。从外部链接变为内部链接。

  • 作用:只在本编译单元(.cpp文件)中可见,其他文件即使使用extern声明也无法访问。

  • 可用来隐藏实现细节,防止多文件编译时的重名冲突

  • 比起全局静态,C++更推荐使用匿名的namespace来替换

  • 代码:

// FileA.cpp static int s_hidden = 100; // 仅 FileA.cpp 可见 static void helper() {} // 仅 FileA.cpp 可见 // FileB.cpp extern int s_hidden; // ❌ 链接错误,找不到该符号

3、静态成员变量(类内部)

  • 本质:属于类本身,不属于某个对象,所有该类的对象共享同一份内存

  • 在C++17之前,静态成员变量必须在类外单独定义并初始化,否则会链接报错。因为一个头文件中的静态成员变量会被多个文件引用,分不清到底是哪个类的静态变量。

  • 为解决上面问题,在C++17中引入 inline static允许在类内部进行初始化,而无需去cpp文件中初始化

  • 代码:

class App { public: static int version; // 声明(未定义) inline static int build = 42; // C++17起:直接定义并初始化,无需类外实现 }; // C++17之前必须在 .cpp 文件补一行: // int App::version = 1;

4、静态成员函数(类内部)

  • 本质:没有this指针,无法访问普通成员变量与函数,只能访问静态成员

  • 调用方式: 通过类名::函数() ,无需创建对象,就可以调用静态成员函数

  • 静态成员函数不能是const静态函数,与virtual虚函数。因为const函数修饰this指针,而静态函数没有this。

  • 而virtual依赖于虚表(vptr)和对象,静态函数不依赖对象

  • 代码:

class Math { public: static double square(double x) { return x * x; } }; double d = Math::square(5.0); // 直接调用

三、总结表格

场景

存储位置/生命周期

作用域/链接性

初始化次数

局部变量

静态存储区(程序结束时才销毁)

函数内部/作用域为函数范围

1次(线程安全)

全局变量/函数

静态存储区

本文件内部(内部链接)

1次(程序启动时初始化)

静态成员函数

静态存储区(全局共享)

类域(需外部定义)

1次

静态成员函数

无this,属于类

类域(通过类名调用)

--

四、static与thread_local变量区别

  • static变量:所有线程共享一份

  • thread_local修饰的变量,每个线程独享一份

http://www.jsqmd.com/news/1075451/

相关文章:

  • SharpIDE: 基于 .NET 与 Godot 引擎的跨平台开源 IDE
  • 终极指南:如何用League Akari自动化英雄联盟客户端,提升游戏效率3倍
  • Tech Interview Handbook:技术面试准备,有人替你整理好了
  • 终极突破!5分钟让网盘下载速度飙升10倍的免费解决方案
  • 自编码器作为特征提取器的分类实践:Fashion-MNIST表征学习教程
  • 5层API转换架构:dxwrapper如何让Windows 10/11完美运行DirectX经典游戏
  • animate.css:给网页加动画,一行代码搞定
  • ArkClaw一键部署:云原生AI Agent如何重构人机协作范式
  • cocos2dx-js cocos creator 实现热更新
  • GStreamer:开源流媒体处理框架
  • 嵌入式系统电源管理实战:从CMOS原理到QorIQ平台深度睡眠实现
  • 影刀RPA项目实战:财务报表自动采集与生成
  • 如何高效对比视频质量差异?video-compare分屏对比工具实战指南
  • 深度解析Dism++:Windows系统维护与优化架构设计与实现原理
  • 如何在3分钟内快速搭建B站视频解析API?完整配置指南
  • 当Win11企业版系统没法使用右键菜单找到“以管理员身份运行”选项来安装软件的解决方法(以安装Python为例)
  • 基于Python+Django+MySQL的健身房管理系统设计与实现(附核心代码)
  • 3个秘诀:Element Plus如何让Vue 3企业应用开发效率提升200%
  • 通达信缠论插件:3分钟搞定专业级技术分析
  • 如何3分钟完成Honey Select 2终极汉化去码:完整配置指南
  • 【2026年华为暑期实习(AI)-6月24日-第三题- 最优分段常数量化】(题目+思路+JavaC++Python解析+在线测试)
  • allegro查看器件高度
  • 提升Java奋斗学习,每日打卡
  • video-compare:开源视频对比工具的终极使用指南
  • 3步搞定黑苹果配置:OpCore Simplify让复杂变简单
  • 解密FanControl风扇调校:从电脑噪音到静音高手的完美蜕变
  • 硕博生私藏改写网站曝光!一键优化语句,查重率与AI疑似率双双压降至合格
  • 2026年亲测AI写作辅助软件指南(合规高效版)
  • python: Worker Pool Pattern
  • 2026 年易柯森特解析:工程监理与造价咨询服务的不同点