《王道》static

《王道》static

1 static的作用

    不考虑类,static的作用主要有三条。

1. 第一个作用:隐藏

    当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。举例说明,假设我们同时编译两个源文件,一个是a.c(或a.cpp),另一个是main.c(或main.cpp)。下面是a.c的内容:


    则在a.c中定义的全局变量a和函数msg能在main.c中使用,这是因为,所有未加static前缀的全局变量和函数都具有全局可见性,其他的源文件也能访问。此例中,a是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件main.c可见。

    如果加了static,就会对其他源文件隐藏。例如在a和msg的定义前加上static,main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。

    static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏,而对于变量,static还有下面两个作用。

2. 第二个作用:默认初始化为0,包括未初始化的全局静态变量与局部静态变量

    其实未初始化的全局变量也具备这一属性,因为未初始化的全局变量和未初始化的静态变量是存储在同一块区域内的(BSS段)。


    (深入理解计算机系统) bss段,data段、text段、堆(heap)和栈(stack)

3. 第三个作用:保持局部变量内容的持久

    函数内的自动(局部)变量,当调用时就存在,退出函数时就消失,但静态局部变量虽然在函数内定义,但静态局部变量始终存在着,也就是说它的生存期为整个源程序,其特点是只进行一次初始化且具有“记忆性”。

    静态局部变量的生存期虽然为整个源程序,但是其作用域仍与局部变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后,尽管该变量还继续存在,但不能使用它。

2 类中static的作用

2.1 静态数据成员

    在类内数据成员的声明前加上关键字static,该数据成员就是累内的静态数据成员。通常,非static数据成员存在于类类型的每个对象中。不像普通的数据成员,static数据成员独立于该类的任意对象而存在;每个static数据成员始于类型相关联的对象,并不与该类的对象相关联,也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其他所有实例所见。

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

    静态数据成员也存储在全局(静态)存储区。静态数据成员定义时要分配空间,所以不能在类声明中定义。static数据成员必须在类定义体的外部定义(正好一次)。

    

    静态成员是类的,只有一份,被每个对象共享,可以直接用类名调用,也可以被类对象调用,但通过类对象调用的依然是共享的数据成员。

    类中数据成员的布局情况是:

    1)非静态成员在类对象中的排列顺序和声明顺序一致,任何在其中间声明的静态成员都不会被放进对象布局中。

    2)静态数据成员存放在程序的全局(静态)存储中,和个别类对象无关。

  

2.2 静态成员函数

    静态成员函数和静态数据成员一样,都是类的内部实现,属于类定义的一部分,它为类服务而不是为某一个类的具体对象服务。

    因为普通成员函数总是具体的属于某个类的具体对象,所以普通的成员函数一般都隐含了一个this指针。因而它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数与访问静态数据成员。

    


猜你喜欢

转载自blog.csdn.net/qq_27022241/article/details/80406416
今日推荐