C/C++中static的作用

static主要有三个作用:

(1)局部静态变量

(2)外部静态变量/函数

(3)静态数据成员/成员函数

前两种C和C++都有,第三种仅在C++中有,下面分别作以下介绍:

一、局部静态变量

在C/C++中, 局部变量按照存储形式可分为三种auto, static, register。其中register不常用到,下面主要说说auto和static的区别。

  1. 存储空间分配和生存周期不同

auto类型局部变量就是普通的局部变量(不加修饰的局部变量默认为该类型)。该类型局部变量存储在栈上,在动态存储区,生命周期仅限于定义它的函数,函数结束,它就自动释放。static类型局部变量存储在静态存储区,在程序整个运行期间都不释放。两者之间的作用域相同,但生存期不同。

  1. static局部变量在所处模块在初次运行时进行初始化工作,且只操作一次。
  2. 对于局部静态变量,如果不赋初值,编译期会自动赋初值0或空字符,而auto类型的初值是不确定的。(对于C++中的class对象例外,class的对象实例如果不初始化,则会自动调用默认构造函数,不管是否是static类型)

特点: static局部变量的”记忆性”与生存期的”全局性”

二、外部静态变量/函数

在C中 static有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。但为了限制全局变量/函数的作用域, 函数或变量前加static使得函数成为静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函 数)。注意此时, 对于外部(全局)变量, 不论是否有static限制, 它的存储区域都是在静态存储区,生存期都是全局的. 此时的static只是起作用域限制作用, 限定作用域在本模块(文件)内部.

使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。

三、静态数据成员/成员函数(C++特有)

C+ +重用了这个关键字,并赋予它与前面不同的第三种含义:表示属于一个类而不是属于此类的任何特定对象的变量和函数. 这是与普通成员函数的最大区别,

也是其应用所在, 比如在对某一个类的对象进行计数时, 计数生成多少个类的实例,

就可以用到静态数据成员. 在这里面, static既不是限定作用域的, 也不是扩展生存期的作用, 而是指示变量/函数在此类中的唯一性. 这也是”属于一个类而不是属于此类的任何特定对象的变量和函数”的含义. 因为它是对整个类来说是唯一的,因此不可能属于某一个实例对象的. (针对静态数据成员而言, 成员函数不管是否是static, 在内存中只有一个副本, 普通成员函数调用时, 需要传入this指针, static成员函数调用时, 没有this指针. )

static在C,C++中都是关键字。但是两者的用法却有些不同:

一,面向过程static的用法:

1,静态全局变量。/静态函数;

1)C语言中的全局变量的作用域是整个程序;只要你在其他的文件中(如果要使用一个全局变量),用extern声明下就可以使用在其他文件中已经定义的全局变量!

这样导致的一个后果就是使得程序比较难以维护,而且命名的错误也显得更为隐蔽!

为了限制其在其他文件中的作用域。

往往就会使用静态全局变量。就是在全局变量前面加上static关键字。此时变量的数据分配的区域仍然是在全局区域内,但是他的作用域却只有在当前文件中,无论在其他文件是否声明了外部的变量!

2)静态函数;

跟静态全局变量类似,原先的全局函数具有的程序域可访问的性质也没有了!只能文件域内访问!

2,静态局部变量;

对于C或者是C++当中函数内部的变量,默认情况下都是分配在堆栈上面的临时局部变量。在函数调用结束以后变量就会被销毁掉。

为了能够在其他函数中共享,可以使用静态局部变量。

在变量前加上static。此时变量的作用域仍然是函数内部但是他的生命周期是全局的!

二,面向对象的static成员;

声明为static的成员其隶属于类。因为他是随着类的初始化加载的,而且只会加载一次!

静态成员函数不管是否是static, 在内存中只有一个副本, 普通成员函数调用时, 需要传入this指针, static成员函数调用时, 没有this指针;

因此在定义的时候应该要注意。在实现静态static函数的时候在CPP中就不用声明了跟virtual的类似!

时间: 2024-10-14 12:12:02

C/C++中static的作用的相关文章

C/C++中static关键字作用总结

1.先来介绍它的第一条也是最重要的一条:隐藏.(static函数,static变量均可) 当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性.举例来说明.同时编译两个源文件,一个是a.c,另一个是main.c. 1 //a.c 2 char a = 'A'; // global variable 3 void msg() 4 { 5 printf("Hello\n"); 6 } //main.c int main() { extern char a; //

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 varia

C中Static的作用

在C中定义一个变量将意味什么? 1.规定变量的取值范围.2.规定变量的操作3.规定变量的作用域(或者生命周期.或者访问控制)4.规定了变量的存储方式(或者存储格式). 在纯C中Static有两个作用(不考虑C++以及二则混合使用): 1.Static修饰局部变量:该变量能在所定义的函数中共享(参考例一). 2.Static修饰全局变量或函数:该变量或函数只在所定义的文件中可见(参考例一). 例一: void foo(void){ static int i = 10; int j = 10; i

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 varia

001.java中static的作用

static的作用: 1.将对象层级提升为类层级 (即将对象可以调用的,提升为对象和类均可调用的成员):   //推荐使用类来调用   ClassNme.静态成员 (包括变量.方法.成员对象) 2.static修饰的成员,在类加载时即准备完成,而不需要创建对象:   //类加载只做一次:1  类名. 的时候会类加载; 2  new 对象时会类加载 3.静态成员方法只能访问静态成员,不能访问非静态成员(因为调用该方法时可能还没有创建对象):    而非静态成员方法既能访问非静态成员,又能访问静态成

JAVA中static什么作用?

是静态修饰符,什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间,也就是只要程序在运行,那么这块内存就会一直存在.这样做有什么意义呢? 在Java程序里面,所有的东西都是对象,而对象的抽象就是类,对于一个类而言,如果要使用他的成员,那么普通情况下必须先实例化对象后,通过对象的引用才能够访问这些成员,但是有种情况例外,就是该成员是用static声明的(在这里所讲排除了类的访

java中static的作用

1.static表示“全局“或者静态的意思.用来修饰成员变量和成员方法,也可以形成静态static代码,被static修饰的成员变量和成员方法独自于该类的任何对象.也就是说,它不依赖类特定的实例,被类的所有实例共享(因此可以用來统计一个类有多少个实例化对象),所以有些属性希望被所有对象共享,则必须将其声明为static属性,被static声明的属性成为全局属性. 2.只要这个类被加载,Java虚拟Papers 机就能根据类名在运行时数据区的方法区内定找到他们.因此,static对象可以在它的任何

笔记:C++中static的作用总结

1.隐藏 当我们同时编译多个文件的时候,所有没加static的全局变量和函数都具有全局可见性,其他的源文件也可以访问 如果加了static,就会对其他源文件隐藏,利用这个特性可以在不同的文件中定义同名函数和同名变量,不用担心命名冲突. 2.对于变量,static还可以:保持变量内容的持久 存储在静态数据区的变量会在第一次运行到的时候完成初始化,也是唯一的一次初始化. 有2种变量存储在静态存储区:全局变量和静态变量 比起全局变量,static更加可以控制变量的可见范围 3.对于变量,static默

Java中static变量作用和用法详解

static表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它不依赖类特定的实例,被类的所有实例共享. 只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们.因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象. 用public修饰的static成员变量和成员方法本质是