• C/C++面试常见问题——static关键字的主要用法


    首先我们要明确一下C/C++的内存区域划分

    在C/C++中内存主要被划分为四大块,堆,栈,全局/静态存储区,代码区

    而全局/静态存储区又被细分为常量区(静态常量区,const关键字修饰),全局区(全局变量区)和静态变量区(静态区,static关键字修饰)

    而被static修饰的变量或全局变量存储在静态变量区

    在C语言中,static关键字主要有两个用法

    1.static修饰函数内的变量

    此时该函数被static修饰的变量的生命周期不在受到函数栈帧的限制,而是贯穿整个程序,并且改变了只能由该函数操控。(本质便是延长了生命周期,但是作用域并没有变化)

    如上图所示,这里还有一点就是变量a只会初始化一次,便是第一次调用test_static()的时候

     2.修饰全局变量

    当static修饰全局变量时,全局变量在本文件中正常使用,但是其他文件无法调用该变量,因此static修饰全局变量相当于做一个安全隔离,其他文件即使声明了也无法访问static修饰的全局变量

    1. //test.h
    2. int a;
    3. static int b;
    4. void test()
    5. {
    6. cout << a << endl;
    7. cout << b << endl;
    8. }
    9. //static.cpp
    10. #include "test.h"
    11. extern int a = 0;
    12. extern static int b = 0;
    13. int main()
    14. {
    15. test();
    16. cout << a << endl;//正常访问
    17. cout << b << endl;//无法访问
    18. return 0;
    19. }

    如上是static在C中的用法

    而在C++中,static也主要有两种用法,而这两种用法主要用于类中

    1.static修饰类内成员变量

    static修饰类内成员变量,那么该静态变量为该类所有对象所共有的静态变量,同时该变量必须要在类外初始化。

    观察上述实验我们发现,类中的静态变量由其所有对象共享一份数据

     2. static修饰类内成员函数

    当static修饰类内成员函数时,该函数主要有以下特性

    ①.静态成员函数无法访问非静态成员变量,这是因为静态成员函数没有this指针,因为其属于类,而不属于对象。众所周知一般成员函数,都会有一个隐藏的this指针,指向调用该函数的对象的成员变量,因此一般成员函数可以正常调用非静态成员变量。

    ②.静态成员函数可以通过声明类作用域调用,因为其属于类不属于对象,因此即使不构建类对象,也可以直接调用

    1. class test_static
    2. {
    3. public:
    4. static void test()
    5. {
    6. //cout << a << endl;//非法调用
    7. cout << b << endl;
    8. //_test();//非法调用
    9. }
    10. void _test()
    11. {
    12. cout << a << endl;
    13. }
    14. public:
    15. int a = 0;
    16. static int b;
    17. };
    18. int test_static::b = 0;
    19. int main()
    20. {
    21. test_static test1;
    22. test1.test();
    23. test_static::test();//成功调用
    24. return 0;
    25. }

    上述如有问题,请各位大佬多多指点,感谢感谢。

  • 相关阅读:
    跨行业人群如何通过NPDP?过来人给的四点建议!
    【RabbitMQ】——发布订阅模式(Fanout)
    Python编程 列表的操作(2)
    架构师必修系列:MVC、MVP、MVVM 三者的区别介绍
    pandas 学习 第15篇:分组 groupby
    自定义一个中间件(功能:解析POST提交到服务器的表单数据)
    [sd_scripts]之fine_tune
    PHP:类型转换
    【python海洋专题二十一】subplots共用一个colorbar
    C++ QT学习笔记
  • 原文地址:https://blog.csdn.net/zcxmjw/article/details/133887868