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

【C++八股】static关键字

static 用于修改变量、函数、类成员的存储方式和作用域。面试中常考 static作用、使用场景、与普通变量的区别

1. static 修饰局部变量

作用:局部变量的生命周期变为整个程序运行期间,但作用域仍然在当前函数内

#include <iostream>
void func() {
    static int count = 0;  // 只初始化一次
    count++;  
    std::cout << count << std::endl;
}

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

特点

  • 只初始化一次(即使多次调用 func())。
  • 不会被销毁,程序结束时才释放。

应用场景计数器、状态保持等。

2. static 修饰全局变量

作用限制全局变量的作用域,使其只能在当前文件内访问

1)普通全局变量(作用域跨文件)

// a.cpp
int globalVar = 10;  // 可以在其他文件访问

// b.cpp
extern int globalVar;  // 其他文件可访问

(2)static 修饰全局变量(作用域仅限当前文件)

// a.cpp
static int globalVar = 10;  // 仅限 a.cpp 使用,b.cpp 无法访问

// b.cpp
extern int globalVar;  // ❌ 编译错误,找不到 globalVar

总结

  • 普通全局变量:作用域跨文件,可以用 extern 引用。
  • static 全局变量只在当前文件可见,防止命名冲突。

应用场景防止变量污染,避免多个文件中的变量重名

3. static 修饰函数

作用限制函数的作用域,使其只能在当前文件内访问

(1)普通函数(可跨文件调用)

// a.cpp
void func() { 
    std::cout << "Hello" << std::endl; 
}

// b.cpp
extern void func();  // ✅ 可以跨文件调用

(2)static 修饰函数(作用域仅限当前文件)

// a.cpp
static void func() {  // 仅限 a.cpp 使用
    std::cout << "Hello" << std::endl;
}

// b.cpp
extern void func();  // ❌ 编译错误,无法访问

总结

  • 普通函数:可以跨文件调用。
  • static 函数仅限当前文件使用,防止函数名冲突。

应用场景隐藏内部实现,避免污染全局命名空间

4. static 修饰类成员

(1)static 修饰类成员变量

作用

  • 所有对象共享,属于而不是对象。
  • 只能在类外初始化
#include <iostream>
class A {
public:
    static int count;  // 声明静态成员变量
};

int A::count = 0;  // ✅ 类外初始化

int main() {
    A obj1, obj2;
    obj1.count = 5;
    std::cout << obj2.count << std::endl;  // 输出 5(共享同一份数据)
}

特点

  • 所有对象共享一份数据
  • 类外初始化(不能在类内直接赋值)

2)static 修饰类成员函数

作用

  • 不依赖对象,可以直接通过类名访问
  • 不能访问非 static 成员变量
    #include <iostream>
    class A {
    public:
        static void show() {  // 静态成员函数
            std::cout << "Static function" << std::endl;
        }
    };
    
    int main() {
        A::show();  // ✅ 直接通过类名访问
    }
    

    特点

  • 不依赖对象,可以直接用 类名::方法() 调用
  • 不能访问普通成员变量,因为静态函数没有 this 指针

应用场景

  • 计数器(统计对象个数)。
  • 单例模式(保证全局唯一对象)。

6. 总结

🔥 面试官常问的 static 关键问题

  1. static 修饰局部变量和普通局部变量的区别?

    • 普通局部变量每次调用都会重新创建static 变量只初始化一次,整个程序生命周期都存在
  2. static 修饰全局变量的作用?

    • 限制作用域到当前文件,防止与其他文件的全局变量重名冲突。
  3. static 修饰函数的作用?

    • 限制作用域到当前文件,防止跨文件调用。
  4. static 修饰类成员的作用?

    • 所有对象共享一个变量,不依赖对象可以直接访问。

口诀记忆

  • 局部变量 static,存活整个程序
  • 全局变量 static,作用范围缩小
  • 函数 static,只能在本文件用
  • 类成员 static,多个对象共用

http://www.kler.cn/a/538809.html

相关文章:

  • Spring Boot整合MQTT
  • Qt:常用控件
  • 【LLM】o1/R1系列LLM数据篇
  • Python Pandas(5):Pandas Excel 文件操作
  • openAI官方prompt技巧(二)
  • 2月7日QT
  • 苹果iPhone 16 Pro Max上手体验:性能极致释放
  • 二级C语言题解:十进制转其他进制、非素数求和、重复数统计
  • Linux 系统搭建 Python 开发环境全流程
  • 基础入门-网站协议身份鉴权OAuth2安全Token令牌JWT值Authirization标头
  • PDF 2.0 的新特性
  • redis之GEO 模块
  • MVCC机制深度解析
  • html语义化
  • 详细教程 | 如何使用DolphinScheduler调度Flink实时任务
  • 瑞芯微 Rockchip 系列 RK3588 主流深度学习框架模型转成 rknn 模型教程
  • mysql8 从C++源码角度看sql生成抽象语法树
  • 定期删除一周前的数据,日志表的表空间会增长吗?
  • springboot基于微信小程序的短文写作竞赛管理系统
  • QT修仙之路1-1--遇见QT
  • docker部署superset并连接华为MRS hive数据库
  • 使用Python实现PDF与SVG相互转换
  • CNN卷积神经网络多变量多步预测,光伏功率预测(Matlab完整源码和数据)
  • PDFMathTranslate-翻译 ble core 5.4全文
  • 算法【Java】—— 动态规划之子序列问题
  • Apipost 调试 Node 服务接口