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

详细说明一下C++中的static关键字

在C++中,static 关键字是一个多功能修饰符,其行为取决于上下文。以下是 static 在不同场景下的详细说明:

1.静态成员变量(Static Member Variables)

定义
在类内部声明为 static 的成员变量,属于类本身而非类的实例,所有对象共享同一份内存。

特点

  • 类级作用域:通过 类名::变量名 访问,无需创建对象。
  • 共享性:所有实例共享同一变量,修改一处会影响所有实例。
  • 初始化:必须在类外单独初始化常量整型除外
  • 生命周期:从程序开始到结束,与类的实例无关。

示例:

class Counter {
public:
    static int count; // 声明
    Counter() { count++; }
};
int Counter::count = 0; // 类外初始化

int main() {
    Counter a, b, c;
    cout << Counter::count; // 输出3
}

2.静态成员函数(Static Member Functions)

定义
在类内部声明为 static 的成员函数,属于类而非实例,没有 this 指针。
特点

  • 仅访问静态成员:不能直接访问非静态成员变量或函数。
  • 调用方式:可通过 类名::函数名() 调用。
  • 用途:常用于工具函数或管理静态数据。

示例

class MathUtils {
public:
    static int add(int a, int b) { return a + b; }
};

int main() {
    cout << MathUtils::add(2, 3); // 输出5
}

3.局部静态变量(Local Static Variables)

定义
在函数内部声明为 static 的局部变量,生命周期贯穿整个程序,但作用域仍限于函数内。

特点

  • 初始化一次:首次执行时初始化,后续调用保留值。
  • 线程安全(C++11后):局部静态变量的初始化是线程安全的。
  • 应用场景:统计函数调用次数、缓存等。

示例

void foo() {
    static int callCount = 0; // 只初始化一次
    callCount++;
    cout << "Called " << callCount << " times\n";
}

int main() {
    foo(); // 输出1
    foo(); // 输出2
}

4.全局静态变量和函数(Global Static)

定义
在全局作用域(文件作用域)中声明为 static 的变量或函数,具有内部链接性。
特点

  • 文件作用域:仅在当前文件可见,避免命名冲突。
  • 隐藏性:其他文件无法通过 extern 引用。

示例

// File1.cpp
static int hiddenVar = 42; // 仅在File1.cpp可见

// File2.cpp
extern int hiddenVar; // 链接错误!无法访问File1的hiddenVar

5.静态对象的销毁顺序

静态变量(包括全局、局部静态、类的静态成员)的销毁按初始化顺序的逆序进行。不同编译单元的静态对象销毁顺序未定义,可能导致依赖问题(见 Singleton 模式 的线程安全实现)。

6.常见应用场景

  • 单例模式:通过静态成员保存唯一实例。
  • 工具类:提供无需实例化的静态方法(如数学计算)。
  • 性能优化:局部静态变量减少重复初始化开销。
  • 资源管理:统计对象数量或跟踪资源使用。

7.总结表

上下文作用生命周期访问方式
类静态成员变量所有实例共享数据程序运行期类名::变量名
类静态成员函数操作静态数据,无 this 指针-类名::函数名()
局部静态变量保留函数调用间的状态程序运行期函数内部
全局静态变量限制变量为文件内可见程序运行期文件内

理解 static 的不同用途,能显著提升代码的模块化、封装性和性能。

http://www.dtcms.com/a/108283.html

相关文章:

  • 火山引擎coze用户市场
  • 使用PyTorch实现GoogleNet(Inception)并训练Fashion-MNIST
  • 【华为OD技术面试真题 - 技术面】- Java面试题(17)
  • 移动端六大语言速记:第1部分 - 基础语法与控制结构
  • 网络安全协议知识点总结
  • 网络空间安全(49)Python基础语法
  • 三.微服务架构中的精妙设计:服务注册/服务发现-Eureka
  • JavaScript reduce 方法详解
  • 视图函数的应用
  • 数据仓库项目启动与管理
  • App与Page构造器
  • vim的操作
  • Java面试31-MySQL如何解决幻读问题?
  • 【HTB】Linux-Shocker靶机渗透
  • 人工智能基础知识笔记七:随机变量的几种分布
  • Font Awesome 音/视频图标
  • 程序代码篇---Arm汇编语言
  • Laravel 中使用 JWT 作用户登录,身份认证
  • vue开始时间小于等于结束时间,且开始时间小于等于系统时间,时间格式:年月日时分
  • Python每日一题(13)
  • 【算法进阶详解】线段树应用
  • 洛谷题单2-P2433 【深基1-2】小学数学 N 合一-python-流程图重构
  • 脑影像分析软件推荐 | CONN
  • Django接入 免费的 AI 大模型——讯飞星火(2025年4月最新!!!)
  • 安装完 miniconda3 ,cmd无法执行 conda 命令
  • 接口测试(2)
  • PyTorch 深度学习实战(32):多模态学习与CLIP模型
  • 中级:Spring框架面试题全解析
  • Labview信号采集与多功能分析系统(可仿真)
  • Python基于Django的新生入学管理系统(附源码,文档说明)