static 作用总结

来源:互联网 发布:主人网络怎么开启 编辑:程序博客网 时间:2024/06/06 04:51

static 的作用总结:

1.不考虑类:

(1)隐藏-----》主要针对函数

比如说你在a.c文件中定义了一个全局变量a和全局函数fun(); 如果不加static 的话。在另一个文件main.c中全局变量和全局函数就是可见的,但是如果加了static的话,全局变量和全局函数就会隐藏,所以这一特性可以在不同源文件中定义函数名相同的函数,而不用担心重名问题。

(2)如果是变量的话,static 有以下两个作用

          a. 默认初始化为0--------------未初始化的全局静态变量和局部静态变量

      

          b.保持局部变量持久

          生存期为整个源程序,只进行一次初始化具有“记忆性” ,但是作用域与局部变量相同

2.考虑类

(1)静态数据成员

   a. 非static 数据成员存在于类的每个对象中,但是static 数据成员独立于该类的任意对象而存在,直接与类关联

   b.静态数据成员同样也遵循public,protected, private 访问规则

   c.静态数据成员不能在类声明中定义,必须在外部定义

    d.类的静态数据成员,像普通数据成员一样,不能在类的定义体中初始化,通常在类的定义体的外部进行初始化

     特例:基本整型const static 数据成员可以在类的定义体中进行初始化

(2)静态成员函数

      普通成员函数总是属于某个类的具体对象,所以普通成员函数都隐藏了一个this 指针,但是静态成员函数不与任何对象关联,因此不具有this 指针


静态成员函数=====不能访问=====》非静态成员函数和非静态数据成员

静态成员函数====只能访问======》静态数据成员和静态成员函数

非静态成员函数===》任意访问=====》静态成员函数和静态数据成员


注意!!!

static 成员函数不能声明为const 成员函数声明为const 就是承诺不会修改该函数所属的对象,而static 成员函数不属于任何对象,同理static 成员函数也不能被声明为virtual volatile


补充:

(1)static 局部变量存储在bss段或者数据段,可以保持上次的值,局部变量保存在堆栈中,不能保持上次的值。

(2)初始化的静态变量存储在数据段(data),未初始化的静态变量存储在相邻的另一块区域中bss段

(3)静态局部变量在函数调用结束时,保存其值,不会随着消失

(4)静态变量只赋一次初值

(5)当某个类的实例修改了该静态变量,其修改值为该类的其他所有实例可见

(6)静态数据成员定义时要分配空间,所以不能在类声明中定义

(7)静态成员是类的,只有一份,被所有对象共享,可以用类名直接调用,也可以被对象调用,通过对象调用的依然是共享的数据成员

(8)非静态成员数据在类中的排列顺序和被声明的顺序相同,任何在其中声明的静态成员都不会被放入对象格局中。



使用static 成员变量而不是全局变量有三个优点

a.static 成员的名字是在类的作用域中,因此可以避免与其他类的对象或者全局对象重名

b.可以实现封装,static 可以是私有成员,但是全局对象不可以

c.static 成员与特定的类相关联,可以清晰显示程序员的意图。

         
原创粉丝点击