0

0

C++中的static关键字有哪些用法?(局部变量、全局变量与类成员)

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-01-15 08:54:10

|

303人浏览过

|

来源于php中文网

原创

static局部变量生命周期延长至程序结束但作用域仍限于函数内,仅首次调用初始化,存储于数据段,多线程下初始化在c++11后线程安全但读写需同步。

c++中的static关键字有哪些用法?(局部变量、全局变量与类成员)

函数内部的 static 局部变量:生命周期延长,但作用域不变

在函数里加 static 声明变量,它就不再每次调用都重建和销毁,而是只初始化一次,后续调用保留上次的值。这点常被误认为“全局变量”,其实它仍只能在该函数内访问。

  • 第一次进入函数时初始化(若带初值),之后跳过初始化步骤
  • 存储在数据段(.data.bss),不是上,所以不会因函数返回而失效
  • 多线程下不安全——多个线程同时首次调用该函数,可能触发多次初始化(C++11 起保证线程安全初始化,但读写仍需同步)
void counter() {
    static int count = 0; // 只在第一次调用时执行初始化
    ++count;
    std::cout << count << std::endl;
}

连续调用 counter() 会输出 123……而不是每次都从 0 开始。

文件作用域的 static 全局变量/函数:限制链接可见性

在源文件(.cpp)顶层用 static 声明变量或函数,它就变成“内部链接”(internal linkage),仅本文件可见,其他 .cpp 文件即使同名也无法访问或冲突。

  • 替代 anonymous namespace 的传统写法(C++ 中二者语义等价,但匿名命名空间更现代、更推荐)
  • 不能用于头文件中定义(否则每个包含它的 .cpp 都生成一份副本,违反 ODR)
  • 链接器不会导出该符号,可减小符号表体积,也避免意外重定义错误
static int helper_value = 42;
static void helper_func() { /* ... */ }

上面两个声明在其他 .cpp 里用 extern int helper_value 会链接失败。

立即学习C++免费学习笔记(深入)”;

Play.ht
Play.ht

根据文本生成多种逼真的语音

下载

类内的 static 数据成员:共享、需定义、无 this

类中声明 static 成员变量,属于整个类而非某个对象,所有实例共用同一份内存。它不占用对象大小(sizeof(MyClass) 不含它),也不参与构造/析构流程。

  • 声明在类内,但必须在类外(且仅一次)定义并可初始化(C++17 起可用 inline 在类内定义)
  • 不能用 this 访问,也不能在构造函数初始化列表中初始化(只能赋值或静态初始化)
  • 模板类的 static 成员需在每个实例化版本中定义,或统一用 inline(C++17+)
struct Counter {
    static int total;
    Counter() { ++total; }
};
int Counter::total = 0; // 必须有这一行(除非 C++17+ 且加 inline)

类内的 static 成员函数:无 this,只能访问 static 成员

static 成员函数本质是“挂”在类名下的普通函数,没有隐式 this 参数,因此不能访问非 static 成员变量或函数,也不能是 const / volatile 限定的。

  • 可通过类名直接调用:MyClass::static_func(),无需对象实例
  • 可访问该类的所有 static 成员(包括私有),但不能访问 non-static 成员
  • 常用于工厂函数、配置获取、工具逻辑等与具体对象无关的操作
class Config {
public:
    static const char* get_version() { return "2.1.0"; }
    static void set_debug(bool b) { debug_mode = b; }
private:
    static bool debug_mode;
};
bool Config::debug_mode = false;

注意:get_version 返回字符串字面量地址,生命周期永久;但若返回局部 std::stringc_str() 就会悬垂——static 函数本身不改变返回值生命周期规则。

C++ 的 static 关键字语义高度依赖上下文,同一个词在函数内、文件顶层、类内分别控制存储期、链接性、共享性,容易混淆。最常踩的坑是忘记类 static 数据成员的类外定义,或误以为文件级 static 变量在线程间安全。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

970

2023.08.02

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

558

2023.09.20

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

89

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

106

2025.09.18

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

738

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

219

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1561

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

649

2023.11.24

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

46

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1万人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号