• static关键字超详细总结


    static关键字(超全总结)

    C语言中:

    静态变量
    • 全局区域分配内存
    • 未经初始化的变量自动初始化为0
    • 静态全局变量只在声明它的整个文件可见,文件外不可见(其它文件可以继续定义被声明为static的变量相同的名字)
    静态函数
    • 同静态全局变量,对其它文件不可见,其它文件可以定义相同的函数名字,不会发生冲突

    C++中:

    类的静态成员变量
    • 类中所有对象所共有的,只分配一次内存

    • 在全局区分配内存,不占用对象的内存,sizeof不计算静态成员变量

      #include <iostream>
      using namespace std;
      
      class A
      {
      public:
      private:
          int a;
          static int b;
      };
      
      int main(int argc, char **argv)
      {
          A a;
          cout << "sizeof a = " << sizeof(a) << endl;
          return 0;
      }
      
      输出: sizeof a = 4
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
    • 类的静态成员变量不能在初始化列表里初始化,也不能在声明的时候初始化,只能在类外初始化

      class A
      {
      public:
          A() : a(5) /* , b(2)  */ {}
          // error: ‘int A::b’ is a static data member; it can only be initialized at its definition
      
      private:
          int a = 1;
          static int b;
          /*  static int b = 2;
              error: ISO C++ forbids in-class initialization of non-const static member ‘A::b’
           */
      };
      
      int A::b = 2; // 正确
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
    • 静态成员变量属于声明的类,不属于某个对象,所以既可以采用对象方式访问,也可以采用类名加::的方式访问

      A a;
      cout << "b = " << a.b << endl;
      cout << "b = " << A::b << endl;
      
      • 1
      • 2
      • 3
    • 静态数据成员和普通函数一样遵循public、protected、private访问规则

    类的静态成员函数
    • 静态成员函数是为类服务,不是为某一个对象,在类的内部实现,属于类的一部分
    • 与普通函数相比,静态成员函数属于类本身,不属于对象,它不具有this指针,所以无法访问类内非静态的成员函数与非静态的成员变量,只能访问其它的静态成员函数与静态成员变量
    • 非静态成员函数能访问类中其它静态成员变量与静态成员函数,静态成员在类中全局共享
    • 静态成员函数还可以通过作用域限定符的方式调用
    静态数据成员与全局变量对比
    • 静态成员变量没有进入程序的全局命名空间,所以不会与程序中其它全局命名冲突
    • 静态数据成员可以实现信息的隐藏,它可以是private成员,但是全局变量不可以
  • 相关阅读:
    iOS .a类型静态库使用终端进行拆解和合并生成
    第三章 将对象映射到 XML - 使用列表或数组定义的属性
    today‘s task
    基于PHP+MYSQL药店会员管理系统的设计与实现
    ARM系统控制和管理接口System Control and Management Interface
    实时交互新篇章:WebSocket在Flutter中的应用与实践
    使用python统计jira bug数据
    Java基础—循环栅栏CyclicBarrier
    [附源码]Python计算机毕业设计SSM家居购物系统(程序+LW)
    springboot+vue前后端分离框架
  • 原文地址:https://blog.csdn.net/weixin_48617416/article/details/128179150