首页 > 分享 > C/C++ static 用法总结

C/C++ static 用法总结

                             static用法


  a.静态局部变量,成为静态局部变量(拥有记忆功能和全局存储权限)
  b.静态全局变量(限制对应全局变量被被其他文件调用)
  c.静态函数
  d.静态类成员(标识此成员属于类而非属于某个特定对象)
  
 1.静态局部变量
   1.1静态局部变量在函数内定义,拥有静态存储期限而不再是自动存储期限,因为静态存储期限的变量拥有永久的

      存储单元,所以在整个程序存储期间都会保留变量的值,尽管退出函数后变量依然存在,但不能使用。


   1.2静态局部变量始终拥有块作用域。(与自动变量作用域相同)


   1.3对基本类型的静态局部变量在定义时若为赋初值,则系统自动赋值为0.


   1.4举例如下:
     void static_local_variable()
     {
     static int count = 0;
     count++;
     }


     第一次进入此函数,静态变量count被初始化为0(若不初始化,系统会自动初始化为0),接下来执行count++。

  而之后调用此函数则只执行count++.


     此函数与以下代码实现同样的功能:
     int count = 0;
     void fuc()
     {
       count++;
     }


  2.静态全局变量
    2.1静态存储期限。如同声明为static的局部变量一样,外部变量拥有静态存储期限,存储在外部变量中的值奖

       被永久的保留下来。


    2.2文件作用域。外部变量拥有文件作用域;从变量被声明的位置开始,一直到所在文件的末尾。因此,跟随在

       外部变量之后声明的所有函数都可以访问。


    2.3举例如下:
      //xxxx.cpp
      void fucOne()
      {
       sCount++;
       count++;
      }

      static int sCount = 0;
      int count = 0;

      void fucTwo()
      {
       sCount++;
       count++;
      }

             a.fucOne()定义在sCount和count变量之前,编译时会提示未声明标示符。而fucTwo()定义在两变量之后,在

        fucTwo()中则可正常使用。且在其他.cpp文件中不可访问。


      b.若两个.cpp文件声明了同名的全局变量,其本质为生命了两个独立的静态全局变量。


      c.count变量则可共享,在xxx.h文件中对其声明 extern int count;在任何一个包含此头文件的.cpp文件中初始化一次即可共享此全局变量。而同样的方法却不适用于静态变量。
      (强烈建议:不要将静态/静态变量定义在.h文件中)

     3.static函数
    3.1内部函数(static函数,不可再其他文件中调用)
      如果在一个原文件中定义的函数只能被此源文件使用,则在函数类型前加 static 关键字即可。(利用了

    static的文件作用域)


      举例如下:
      static void fuc()
      {
      }


    3.2外部函数(可在其他文件中调用)

             举例如下:

             //file.cpp
      [extern] void fuc()
      {


      }

             //main.cpp
      int main()
      {


       extern void fuc();
      }

           4.静态类成员
      4.1 类的静态成员可以是private的或public的。静态数据成员可以是常量、指针、引用、类类型等。
      4.2 其静态成员属于类而非某个特定对象。其静态成员函数中也不能使用this指针。
      4.2 类静态成员的使用
        a.定义并初始化
          一般来说,不能在类的内部初始化静态数据成员,相反的,必须在类的外部定义和初始化每个静态数据成

        员。


          举例如下:
        //xxxx.h
        class A
        {
          private:
            static int count;//声明
          public:
            static  void fuc();
        }

                 int A::count = 0;//定义、初始化
        (注意:最好将静态数据成员的定义初始化放在对应的.cpp文件中,若像如上定义,在此头文件被多次包含时,静态成员会被重复定义)


        b.类内初始化
          如果某个数据成员的应用场景仅限于编译器可以替换它的情况,则一个初始化的const或constexpr static不需要分别定义.
          举例如下:

                     class Account
          {


            public: 
              static doule fuc(){};
            private:
              static constexpr int NUM = 30;
              int array[NUM];
          }

                     相反若它将用于值不能替换的场景中,则该成员必须有一条定义语句:
          举例如下:
          constexpr int Account::NUM;//只定义,不初始化,初始化已在类内提供
          (建议:即使一个常量静态数据成员在类内被初始化了,通常情况下也应该在类外定义一下该成员)
        
        c.静态成员的两个应用
          (1)静态成员可以是不完全类型(不完全类型:只声明,未定义)
          (2)可以用静态成员作为默认实参

相关知识

a=b++,c++和a=(b++,c++)的区别
在C++中有以下4条语句: static int hot=200; int &a
C++中+= 是什么意思
C++程序设计(上)练习
【C语言/C++】桌面宠物开发(纳西妲)!程序员教你如何把喜欢的角色做成随便把玩的桌面宠物,源码可分享!
C/C++课程设计题目[2023
+=的特殊效果,常量的赋值和变量的赋值,什么是javabean
兽用维生素c的作用及功能,附用法和用量
【QT/C++】自制一只你的专属宠物,桌面体验感升级100%!零基础小白级操作,不怕你不会!
狗狗能吃维生素c吗

网址: C/C++ static 用法总结 https://m.mcbbbk.com/newsview454710.html

所属分类:萌宠日常
上一篇: POS打印机系列之 => 并口
下一篇: 猎人怎么控制自己的宠物 多少级能