static(静态)变量的作用

来源:互联网 发布:淘宝卖家秀大尺度脱毛 编辑:程序博客网 时间:2024/05/18 00:20

1.在函数体中静态变量有记忆功能,在这一函数被调用过程中其值维持不变。

2.在模块内,它的作用域范围是有限制的,如果一个变量被申明为静态的,那么该变量可以被模块内所有函数访问,但不能被模块内其他函数访问。

3.内部函数应该在当前源文件中说明和定义,对于可以在当前源文件以外使用的函数,应该在一个头文件中说明,使用这些函数的源文件应该包含该头文件

4.C++中,在类内的数据成员的声明前加上关键字 static,该成员就是类的静态数据成员。

静态数据成员有以下特点:

1)对于非静态数据成员们,每个类对象都有自己的复制品。而静态数据成员被当做是类的成员。无论这个类的对象被定义多少个,

静态数据成员在程序中也只有一份复制品,由该类型的所有对象共享访问。

(2)静态数据成员存储在全局数据区。定义时要分配空间,所以不能在类申明中定义。由于静态数据成员属于本类的所有对象共享,所以它不属于特定的类对象,

在没有产生类对象时其作用域就可见。

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

(4) static 成员变量的初始化是在类外,此时有 protectprivate修饰的static变量虽然可以子啊类外初始化,但是不能在类外被访问。

与全局变量相比,使用静态数据成员有以下两个优势:

(1) 静态数据成员没有静茹程序的全局名字空间,因此不存在与程序中其他全局名字冲突。

(2) 可以实现隐藏。静态数据成员可以是 private,而全局不能

静态成员函数:

在类的成员函数前面添加static关键字后就变为了类对的静态成员函数,静态成员函数为类的全部服务而不是某一个类的具体对象服务。

静态成员函数是类的内部实现,属于类定义的一部分。

普通的成员函数一般都隐含了一个this指针,this指针指向类的对象本身,因为普通成员函数总是具体的属于某个类的具体对象的。通常情况下,this

是默认的。如函数 fn()实际上是 this->fn();.但是与普通函数相比,静态成员函数由于不是与任何对象相联系,因此它不具有this指针

。从这个意义上讲,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数。

引申1:为什么static变量只初始化一次?

对于所有对象(不仅仅是静态对象),初始化都只有一次,而由于静态变量具有记忆功能,初始化后一直没有被销毁,都会保存在内存区域中,

所以不会再次初始化。

存放在静态区的变量的生命周期一般比较长,一般与整个源程序同生死.共存亡, 所以它只需初始化一次

而 auto 变量,即自动变量,由于存放在栈区,一旦调用过程结束,就会立刻被销毁。

例:

void fun(int i) {

    printf("i = %d\n", i);

    static int value = i++;

    printf("i = %d\n", i);

    printf("value = %d\n", value);

}

int main()

{

    fun(0);

    fun(1);

    fun(2);

    return 0;

}

输出:

i = 0

i = 1

value = 0

i = 1

i = 1

value = 0

i = 2

i = 2

value = 0

因为value是静态类型(static)只会定义一次,也就是说,不管fun()这个函数被调用多少次,static int value = i++

这条语句只会在第一次被调用时会执行。

引申2:在头文件中定义静态变量是否可行为什么?

不可行,如果在头文件中定义静态变量,会造成资源浪费的问题,同时也可能引起程序错误。因为如果使用了该头文件的每个C语言文件

中定义的静态变量,按照编译的步骤,在每个头文件中都会单独存在一个静态变量,从而会引起空间浪费或程序错误。

所以不推荐在头文件中定义任何变量,当然也包括静态变量。

原创粉丝点击