c++ static的用法总结

参考链接:https://blog.csdn.net/mznewfacer/article/details/6898005

static的作用主要有以下3个:1、扩展生存期;2、限制作用域;3、唯一性;

1、扩展生存期

       这一点主要是针对普通局部变量和static局部变量来说的。声明为static的局部变量的生

存期不再是当前作用域,而是整个程序的生存期。

       在程序中,常用内存类型主要有堆、栈和静态存储区。要理解static局部变量就必须首先

理解这三种内存类型。

      在C/C++中, 局部变量按照存储形式可分为三种auto, static, register,局部变量的默认类型都是auto,从栈中分配内存。

auto是在变量在进入其作用域的时候被分配,离开其作用域的时候被释放,static则是按程序的生命周期来分配释放变量即在执行main之前static就被初始化了。等程序结束时才被释放。

(堆、栈、静态存储区的概念)

堆:由程序员自己分配释放(用malloc和free,或new和delete) ,如果我们不手动释放,

那就要到程序结束才释放。如果对分配的空间在不用的时候不释放而一味的分配,那么可

能会引起内存泄漏,其容量取决于虚拟内存,较大。

栈:由编译器自动分配释放,其中存放在主调函数中被调函数的下一句代码、函数参数和

局部变量,容量有限,较小。

静态存储区:由在编译时由编译器分配,由系统释放,其中存放的是全局变量、static变

量和常量.

区别:

1)   堆是由低地址向高地址扩展,栈是由高地址向低地址扩展。

2)   堆是不连续的空间,栈是连续的空间。

3)   在申请空间后,栈的分配要比堆的快。对于堆,先遍历存放空闲存储地址的链表、

修改链表、再进行分配;对于栈,只要剩下的可用空间足够,就可分配到,如果不够,那

么就会报告栈溢出。

4)   栈的生命期最短,到函数调用结束时;静态存储区的生命期最长,到程序结束时;

堆中的生命期是到被我们手动释放时(如果整个过程中都不手动释放,那就到程序结束时

)。


2.限制作用域

      对于全局变量而言,不论是普通全局 变量还是static全局变量,其存储区都是静态存储区,因此在内存分配上没有什么区别。

区别:

1)普通的全局变量和函数,其作用域为整个程序或项目,外部文件(其它cpp文件)可以通过extern关键字访问该变量和函数。

2)static全局变量和函数,其作用域为当前cpp文件,其它的cpp文件不能访问该变量和函数。如果有两个cpp文件声明了同名的全局静态变量,那么他们实际上是独立的两个变量。

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

头文件中的static变量。

    如果在一个头文件中声明:static int g_vaule = 0;那么会为每个包含该头文件的cpp都创建一个全局变量,但他们都是独立的;


3.数据唯一性

这是C++对static关键字的重用。主要指静态数据成员/成员函数唯一性指的是static修饰的数据成员/成员函数属于类而不是属于此类的任何对象的变量和函数(针对静态数据成员而言, 成员函数不管是否是static, 在内存中只有一个副本, 普通成员函数调用时, 需要传入this指针, static成员函数调用时, 没有this指针. )

static数据成员的初始化:

(1) 初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆。

(2) 初始化时不加该成员的访问权限控制符private,public等。

(3) 初始化时使用作用域运算符来标明它所属类,因此,静态数据成员是类的成员,而不是对象的成员。

(4) 静态数据成员是静态存储的,它是静态生存期,必须对它进行初始化。


Static成员函数

(1)静态成员函数和静态数据成员一样,它们都属于类的静态成员,它们都不是对象成员。因此,对静态成员的引用不需要用对象名。

(2)静态成员函数仅能访问静态的数据成员,不能访问非静态的数据成员,也不能访问非静态的成员函数,这是由于静态的成员函数没有this指针。


static全局静态变量

在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。

1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)

2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)

3)作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。

定义全局静态变量的好处:

<1>不会被其他文件所访问,修改

<2>其他文件中可以使用相同名字的变量,不会发生**。

static局部静态变量

在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。

1)内存中的位置:静态存储区

2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)

3)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。

注:当static用来修饰局部变量的时候,它就改变了局部变量的存储位置,从原来的栈中存放改为静态存储区。但是局部静态变量在离开作用域之后,并没有被销毁,而是仍然驻留在内存当中,直到程序结束,只不过我们不能再对他进行访问。

当static用来修饰全局变量的时候,它就改变了全局变量的作用域(在声明他的文件之外是不可见的),但是没有改变它的存放位置,还是在静态存储区中。


static的特性

   

   (1)  static的隐藏特性:也就是上面说的static只对当前的cpp有用对于其他文件的cpp是没有用的——隐藏。

   (2)  static的第二个特性是保持变量内容的持久

   (3)  static的第三个特性是默认初始化为0







猜你喜欢

转载自blog.csdn.net/qq_35307209/article/details/80269773