static关键字的特点

主要从两个方面做回答,存储域和作用域

1.第一条也是最重要的一条:隐藏.(static函数和static变量均可)

当同事编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。

举个例子:

同时编译两个源文件,一个是a.c,另一个是main.c。

// a.c
char a = 'A';
void msg(){
	printf("hello\n");
}
// main.c
int main(){
	extern char a;
	printf("%c",a);
	(void)msg();
	return 0;
}

程序运行的结果是:

A hello

为什么在a.c中定义的局部变量a和函数msg能在main.c中使用?前面说过,所有未加static前缀的

全局变量和函数都具有全局可见性,其他的源文件也能访问。此例中,a是全局变量,msg是函数,并且

都没有加static前缀,因此对于另外的源文件main.c是可见的。

如果加了static,就会对其他源文件隐藏。例如在 a和msg的定义前面加上static,main.c就看不到它们了,

利用这一特性可以再不同的文件定义同名函数和同名变量,而不必担心命名冲突。static可以用作函数和变量的

前缀,对于函数来讲,static的作用仅限于隐藏。

2.static的第二个作用是保持变量内容的持久。(static变量中的记忆功能和全局生存期)

存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储

在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围。

PS:如果作为static局部变量在函数内定义,它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能

在定义该变量的函数内使用该变量。退出该函数后,尽管该变量还继续存在,但是不能使用它。

#include 
int fun(){
    static int count = 10;       //在第一次进入这个函数的时候,变量a被初始化为10!并接着自减1,以后每次进入该函数,a
    return count--;              //就不会被再次初始化了,仅进行自减1的操作;在static发明前,要达到同样的功能,则只能使用全局变量:    

}
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;
}

基于以上两点可以得出一个结论:

把局部变量改为静态变量后是改变了它的存储方式,即改变了它的生存周期。把全局变量改变为静态变量后是改变了它的作用域,

限制了它的使用范围,。因此static这个说明符在不同的地方所起的作用是不同的。

3.static的第三个作用是默认初始化为0 (static变量)

4.static的第四个作用:c++中的类成员声明static

在类中声明static变量或函数时,初始化时使用作用域运算符来表明它所属类,因此,静态数据成员是类的成员

不是对象的成员,这样就出现以下作用:

1)类的静态成员函数时属于整个类而不是类的对象,所以它没有this指针,这就导致了它仅能访问类的静态成员数据和静态成员函数

2)不能将静态成员函数定义为虚函数

3)static并没有增加程序的时空开销,相反还缩短了子类对父类静态成员的访问时间,节省了子类的内存空间

4)静态数据成员必须进行初始化



你可能感兴趣的:(C++语言)