【总结】static关键字的用法及作用

首先,我们要明确static是静态关键字。在C语言和C++中,我们都会用到static关键字,并且对于static有不同的用法和作用。接下来我将就C语言和C++两个不同的编译环境分别对static关键字的用法和作用进行讲述。

1、在C语言中,static关键字主要定义全局静态变量、局部静态变量、静态函数。

(1)定义全局静态变量:在全局变量前加上关键字static,该全局变量就变成了全局静态变量。有以下特点:

          在(静态存储区)全局数据区分配内存,在整个程序运行期间一直有效。

          如果未对其进行初始化,其默认值为0.

          该变量在本文件内从定义开始到文件结束可见。(在其他文件内不可见)

          注意:全局变量也保存在静态存储区;若未手动初始化,编译器也会为其自动初始化为0;但是,全局变量在整个工程内可见,静态全局变量只在定义的本文件内可见。

(2)定义局部静态变量:在局部变量前加上关键字static,该局部变量就变成了局部静态变量。有以下特点:

          在(静态存储区)全局数据区分配内存。

          如果未对其进行初始化,其将被隐式初始化为0.

          始终驻留在静态存储区,知道程序运行结束。

          其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之消失。

          注意:局部变量作用域也为局部作用域,定义它的函数或语句块结束时,其作用域随之消失;但是局部变量在栈中分配内存;如未对其进行初始化,编译器将会给它赋随机值;局部变量会随着函数栈帧的释放而消失。

(3)定义静态函数:在函数的返回类型加上static关键字,函数就变成了静态函数。有以下特点:

          静态函数只能在本源文件中使用。

          在文件作用域中声明的inline函数(C++)默认为static。

          使用静态函数可以在其他文件中定义同名的函数,而不用考虑会出现名字冲突或者冲定义的错误。

          注意:static函数和普通函数的最大的区别在于作用域方面,static函数限定在本源码文件中,不能被本源码文件以外的代码文件调用。而普通的函数,默认是extern的,也就是说,可以被其它代码文件调用该函数。同时static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。

2、在C++中static新增了两种作用:定义静态数据成员、静态函数成员。

(1)定义静态数据成员,有以下特点

          在程序的全局数据区分配

          在类外初始化。因为静态数据成员定义时要分配空间,所以不能在类中声明。(静态数据成员不可以用参数初始化表进行初始化操作,是因为初始化表是在定义对象的时候进行的利用了this指针进行操作)。

          没有this指针。静态数据成员的存储空间不同于普通的数据成员,它不属于类的任何一个对象,是独立于对象存储的。

          静态数据成员是属于一个类的而不是某一个对象,它是为该类所定义的所有的对象所共有。该类所定义的对象都可以引用该静态成员,并且值都是一样的。

          注意:类中的常数据成员只能通过构造函数的参数初始化表进行初始化,且一经赋初值,不能被修改;常数据成员是实例化对象的一部分,可以用this指针访问。静态数据成员是可以被修改的,而且可以被任何一个对象修改,修改后的值,可以被所有的对象共享。

(2)静态成员函数。有如下特点:

          没有this指针。

          静态成员函数属于一个类而不是一个对象。

          静态成员函数不能访问非静态数据成员。(非静态数据成员属于特定的类实例,主要用于对静态数据成员进行操作)

          注意:如果静态成员函数要引用非静态成员时,可以通过对象来引用。从中可以看出,调用静态成员函数使用如下格式:<类名>::<静态成员函数名>(<参数表>。

总结:其实我自己认为静态关键字可以用扩大和缩小的思想来看。首先扩大:加上静态关键字后存储区域变成了全局数据区;且只有程序运行结束才被销毁;加上静态关键字后,属于类而非对象。缩小:只在本源文件中可见。

发布了20 篇原创文章 · 获赞 24 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ifiwere/article/details/104459702