C/C++ Static总结

来源:互联网 发布:linux下如何卸载jdk1.8 编辑:程序博客网 时间:2024/06/03 22:03


static的作用主要有以下3个:

1、扩展生存期;

2、限制作用域;

3、唯一性;

1、扩展生存期

    这一点主要是针对普通局部变量和static局部变量来说的。声明为static的局部变量的生存期不再是当前作用域,而是整个程序的生存期。

    在程序中,常用内存类型主要有堆、栈和静态存储区。要理解static局部变量就必须首先理解这三种内存类型。见【http://blog.csdn.net/xiyanlgu/article/details/8649643#】

    在C/C++中, 局部变量按照存储形式可分为三种auto, static, register(谭浩强, 第174-175页)

   局部变量的默认类型都是auto,从栈中分配内存。auto的含义是由程序自动控制变量的生存周期,通常指的就是变量在进入其作用域的时候被分配,离开其作用域的时候被释放。

   而static变量,不管是局部还是全局,都存放在静态存储区。表面意思就是不auto,变量在程序初始化时被分配,直到程序退出前才被释放;也就是static是按照程序的生命周期来分配释放变量的,而不是变量自己的生命周期. 如果在main前设置断点,然后查看static变量,已经被初始化,也就是说static在执行main函数前已经被初始化。也就是在程序初始化时被分配。


2、限制作用域

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

区 别在于:

1) 普通的全局变量和函数,其作用域为整个程序或项目,外部文件(其它cpp文件)可以通过extern关键字访问该变量和函数。一般不提倡这种用法,如果要在多个cpp文件间共享数据,应该将数据声明为extern类型。

    

在头文件里声明为extern:

    extern int g_value;     // 注意,不要初始化值!

   然后在其中任何一个包含该头文件的cpp中初始化(一次)就好:

   int g_value = 0;     // 初始化一样不要extern修饰,因为extern也是声明性关键字;

   然后所有包含该头文件的cpp文件都可以用g_value这个名字访问相同的一个变量;


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

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


头文件中的static变量

   如果在一个头文件中声明:

       staticint g_vaule = 0;

      那么会为每个包含该头文件的cpp都创建一个全局变量,但他们都是独立的;所以也不建议这样的写法,一样不明确需要怎样使用这个变量,因为只是创建了一组同名而不同作用域的变量。


3、数据唯一性

这是C++对static关键字的重用。主要指静态数据成员/成员函数。

static数据成员的初始化:

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

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

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

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


Static成员函数

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

#include <stdio.h>int fun(void){    staticint count = 10;    // 事实上此赋值语句从来没有执行过    return count--;}int count = 1;int main(void){         printf("global\t\tlocal static\n");    for(; count <= 10; ++count)         printf("%d\t\t%d\n", count, fun());        return 0;}


C 和C++ 中static的区别


C++ :

     static 局部变量
    1)内存中的位置:静态存储区
    2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
    3)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。


C:

    static局部变量作用于整个程序的运行阶段,知道程序运行结束,销毁static局部变量。

原创粉丝点击