c和c ++之间关键字static的区别是什么?

我知道c中的关键字有两种用法:

  • 修改变量

    • 修改全局变量

      此用法限制了全局变量范围的范围,从定义的点到文件末尾。

    • 修改局部变量

      这种用法限制了定义的函数中局部变量的范围,但也保留在内存的静态区域中

  • 修改function

    这意味着只能调用它定义的文件中的函数。

而在c ++中,除了c中的用法之外, static还用于修改类的数据成员和函数成员。 此用法限制属于类的成员而不是类的对象。

我想知道c / c ++中有什么static用法吗?

static可能是C和C ++中最容易混淆的重载关键字。 它意味着不同的地方有不同的东西。

  • 在函数中, static是一个存储类 ,表示在程序的生命周期中存在的变量。 所以说

     void f() { static int i = 0; } 

    说在调用f()之间会保留i的值。 其他存储类是默认的auto (但要注意C ++ 11中的含义的变化), externregister ,以及C11 / C ++ 11中的thread_local

  • 在文件范围(或C ++中的命名空间范围)中, static是一个链接说明符 。 以这种方式标记为static函数和变量具有内部链接 ,因此当前转换单元是本地的。 这意味着一个像这样的function

      static int f() { return 3; } 

    只能由同一.c文件中的其他函数引用。 在C ++ 03中不推荐使用static ,而是使用未命名的命名空间。 我在某处看过它在C ++ 11中再次未被提及。

  • 在C ++中,当应用于类的成员函数或成员变量时,这意味着函数或变量不需要类实例才能被访问。 除了C ++类访问说明符适用于成员之外,“类静态”成员函数/变量和全局函数/变量在实现方面几乎没有什么不同。

  • 最后一个:在C99(但不是C ++)中, static可以在数组函数参数中使用,如下所示:

     void f(int a[static 4]) { } 

    这指定参数a必须是一个大小至少为4的整数数组。

我想这就是所有这些,但如果有任何我忘记的话,请在评论中告诉我!

静态在C语言系列中,静态变量是在编译单元(源文件或模块)的生命周期中存在的变量。 静态变量可以在模块范围内声明,因此可以由同一源文件中定义的所有函数访问。 这样的静态变量不能直接从其他模块访问,但内部模块API可以将指针传递给静态变量并通过指针修改它们。 静态变量也可以在函数体中声明,其中通常的范围规则适用。 函数内声明的静态变量仅在初始化模块时初始化(通常在应用程序加载时),并在包含定义的函数的多次调用中保留其值。

在C ++中,静态变量也可以是类定义的成员。 对静态成员变量的访问由标准访问修饰符(private,public,protected)控制,但此类的所有实例共享相同的静态变量,并共享相同的值。 修改此变量的值会影响该类的所有对象。 易失性volatile关键字是不同的东西,并不以任何方式与静态相反。 静态变量可以声明也可以不声明为volatile,就像全局变量或局部变量一样。 volatile关键字是一个提示,通知编译器在没有编译器知识的情况下变量的值可能会发生变化。 因此,编译器的代码优化器不能对变量的当前值进行假设,并且必须始终(重新)读取变量的内容。

参考c ++ – > static关键字可用于声明变量,函数,类数据成员和类函数。

以下是不同场景中的常见用法( 参考MSDN )

  • 在文件范围(全局和/或命名空间范围)声明变量或函数时,static关键字指定变量或函数具有内部链接。 声明变量时,变量具有静态持续时间,编译器将其初始化为0,除非您指定另一个值。

  • 在函数中声明变量时,static关键字指定变量在对该函数的调用之间保持其状态。

  • 在类声明中声明数据成员时,static关键字指定该类的所有实例共享该成员的一个副本。 必须在文件范围定义静态数据成员。 您声明为const static的整数数据成员可以具有初始化程序。

  • 在类声明中声明成员函数时,static关键字指定该函数由该类的所有实例共享。 静态成员函数无法访问实例成员,因为该函数没有隐式this指针。 要访问实例成员,请使用作为实例指针或引用的参数声明该函数。

  • 您不能将union的成员声明为static。 但是,必须将全局声明的匿名联合声明为静态声明。

检查以下内容:
static关键字及其在C ++中的各种用途

static关键字用法