添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

C语言中,static(静态)变量的作用

  1. 在函数体内,静态变量具有“记忆”功能,即一个被声明为静态的变量只会被初始化一次,然后在这一函数被调用的过程中其值维持不变

  2. 在文件内(但在函数体外),用来限制变量或函数的作用域为当前文件,即如果一个变量被声明为静态的,那么该变量可以被当前文件内所有函数访问,但不能被其他文件中的函数访问。它是一个本地的全局变量,且只会被初始化一次。

  3. 如果一个函数被声明为静态的,那么该函数与普通函数作用域不同,其作用域仅在本文件中,它只可被当前文件内的其他函数调用,不能被其他文件的函数调用。也就是说,这个函数被限制在仅能被声明它的文件内使用。

C++中,static(静态)变量的作用

对于C++,除了C语言中的功能外,在类内的数据成员也可以被定义为static,在这种情况下,该数据成员就是类的静态数据成员,静态数据成员有以下特点:

  1. 对于非静态数据成员,每个对象都有自己单独的一个副本。而静态数据成员被当作是类的成员,只会存在唯一的副本,且被所有对象共享。

  2. 静态成员变量属于类而不属于对象。也就是说,即使没有实例化的对象,也可以使用静态变量,通常通过“类名::静态成员变量”来访问。

  3. 静态数据成员和普通数据成员一样遵从public、protected、private访问规则

  4. static成员变量的初始化是在类外,初始化的时候不需要再使用static关键字。被private或protected修饰的static成员虽然可以在类外初始化,但是不能在类外被访问。

  5. 在类中,被static修饰的函数是类的静态成员函数,静态成员函数也属于类,而不属于某一个特定对象,被所有对象共享。因此,它没有this指针。从这个意义上讲,类的静态成员函数无法访问对象成员,也无法访问普通成员函数,它只能访问静态成员函数或静态成员变量。

静态数据成员的优势

与全局变量相比,使用静态数据成员有以下两个优势:

  1. 全局变量的作用范围是整个工程,而static变量的作用范围仅仅是这个变量所在的文件。static变量与全局变量相比,减少了命名冲突的可能性。可以在不同文件中定义名称相同的static变量,但是不能定义名字相同的全局变量。

  2. 可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能。

类的静态成员必须初始化,而且必须在类外初始化。类中的静态成员变量仅仅是声明,而变量被声明的时候不分配内存空间,只有在定义的时候才分配空间,变量的声明可以理解为一个承诺,它承诺这个变量将会在某个地方被定义。

由于类的声明可能会被多个地方引用,如果把静态变量的初始化放在类内,每次引用都会初始化一次(分配一次空间),这与静态变量只能初始化一次且只存在一个副本相冲突,因此静态变量只能在类外初始化。

为什么static变量只初始化一次

对于所有对象(不仅仅是静态对象),初始化都只有一次,而由于静态变量具有记忆功能,初始化后,一直都没有被销毁,都会保存在内存区域中,所以不会在此初始化。

存放在静态区的变量的生命周期一般都比较长,在程序结束后被释放,所以它只需初始化一次。而auto变量,即自动变量,由于它存放在栈区,一旦函数调用结束,就会立刻被销毁。

是否可以在头文件中定义静态变量

不可行,如果在头文件中定义静态变量,会造成资源浪费,同时也可能引起程序错误。因为如果在使用了该头文件的每个C语言文件中定义静态变量,按照编译的步骤,在每个头文件中都会单独存在一个静态变量,从而引起空间浪费或程序错误。

所以,不推荐在头文件中定义任何变量。

C语言中,static(静态)变量的作用在函数体内,静态变量具有“记忆”功能,即一个被声明为静态的变量只会被初始化一次,然后在这一函数被调用的过程中其值维持不变在文件内(但在函数体外),用来限制变量或函数的作用域为当前文件,即如果一个变量被声明为静态的,那么该变量可以被当前文件内所有函数访问,但不能被其他文件中的函数访问。它是一个本地的全局变量,且只会被初始化一次。如果一个函数被声明为静态的,那么该函数与普通函数作用域不同,其作用域仅在本文件中,它只可被当前文件内的其他函数调用,不能被其他
1.先来介绍它的第一条也是最重要的一条:隐藏。( static 函数, static 变量 均可) 当同时编译多个文件时,所有未加 static 前缀的全局 变量 和函数都具有全局可见性。 举例来说明,同时编译两个源文件,一个是a.c,另一个是main.c。 //a.c char a = 'A'; // global variable void msg() printf("Hello\n"); //main.c int main() extern char a; // extern v
C/ C++ 中的 静态变量 1. 静态 全局 变量 2. 静态 局部 变量 3. 静态 函数4.类内 静态 成员 变量 5. 类内 静态 局部 变量 6.类内 静态 函数 C语言中与“ 静态 ”相关的词包括, 静态 全局 变量 静态 局部 变量 静态 函数,关键词是 static 。C语言中的 变量 作用 域分,可以分为全局 变量 和局部 变量 ;从存储方式分,可以分为 静态 存储方式和动态存储方式。 需要区分的概念是,全局 变量 是存储在 静态 存储区的,所谓的 静态 存储区是一个进程所分配内存的.bss和.data段,但全局 变量 不是并不是 静态变量 。 1. 静态 全局 变量 下面代码中的a属于全局
类定义时的 静态 成员只是声明, 静态 成员的定义和初始化要在类之外完成 C++ static 关键字可修饰类成员 变量 /方法,表示 变量 /方法不从属于特定对象,而是属于类的。仔细琢磨 静态 成员 变量 ,会发现其与 C++ 的方式既相容也矛盾,具有特殊性。 先说相容的一面。·C/ C++ ·有声明和定义的说法:声明给出签名,定义给出具体实现。对类型而言,声明不一定能知道其对象占用空间大小,但根据定义肯定能确定内存占用。说 静态 成员与 C++ 方式是相容的,因为其初始化方式与方法的定义一致。下面是一个例子: // Foo.hpp namespace tlanyan { // 类声明和定义 class Foo { 静态 局部 变量 :进程的运行过程中,函数退出不被销毁 静态 全局 变量 :只能被本文件的函数调用访问,对其他源文件不可见 静态 函数:只在声明它的文件中可见,对其他源文件不可见。定义时不加 static 作用 总结:   1、隐藏。对其他源文件不可见。与其他文件的同名函数或 变量 不存在冲突问题,降低模块间的耦合度。   2、持久性,在进程运行过程中不释放   3、如果不赋初始值,初始化默认值为0; C++ 中的 static C++ 中的 static 面向过
C++ 静态 成员函数与 静态 成员 变量 static ) 这篇介绍了 静态 成员函数与 静态 成员 变量 ,是我的读书笔记,我希望它够简短但又比较全面,起到复习的 作用 。如果有一些 C++ 知识记不清楚了,它可以帮你很快回忆起来。 复习C语言的 static 关键字 (1)加在局部 变量 的前面使之成为 静态 局部 变量 作用 域还是在函数内部,可是生存周期延长了。 (2)加在全局 变量 的前面限定该 变量 作用 域为文件 作用 域,就是说即使其他文件使用了extern扩展 作用 域也不行。这在C语言的多人项目中非常有用,避免了 变量 的重名。然而在 C++ 中这一功能已经被命名空间取代,但是为了保持和C语言的兼容, static 还是有这样的功能。 函数定义和代码块之外的 变量 声明 static 修改标识符的链接属性,由默认的external变成internal, 作用 域和存储类型不变,这些符号只能在声明它们的源文件内部实现. 代码块内部的 变量 声明 static 修改标识符的存储类型,由自动 变量 改为 静态变量 作用 域和链接属性不变。这种 变量 在程序执行之前就创建,在程序执行的整个周期都存在。 类成员 变量 和成员函数 对于被stati...
全局 变量 静态变量 都是在程序运行时分配内存的 变量 ,但它们在 作用 域和生命周期上有所不同。 全局 变量 作用 域是整个程序,它们在程序启动时被分配内存,在程序结束时才会被释放。在定义全局 变量 时,如果没有使用 static 关键字修饰,则全局 变量 是外部链接的,可以被其他文件引用,如果使用了 static 关键字,则全局 变量 是内部链接的,只能被定义的文件内部访问。 静态变量 作用 域是在定义它们的函数内部,但它们的生命周期与全局 变量 相同,也是在程序启动时分配内存,在程序结束时才会被释放。 静态变量 只会被初始化一次,即使函数被多次调用, 静态变量 的值也会保持不变。如果在定义时使用了 static 关键字,则该 静态变量 只能在定义它的函数内部访问,如果没有使用 static 关键字,则该 静态变量 可以被其他函数访问。