C++中的static修饰符

一、static静态总概述

首先说明,由static修饰的变量叫作静态变量,由static修饰的函数叫作静态函数。总的来说,静态变量指的是在程序执行前,系统就为之分配存储空间的一类变量(在运行时不再分配内存)。

二、static使用场景---静态变量

首先,介绍静态存储区的概念。静态存储区:内存在程序编译时即已经分配好,这块内存在程序的整个运行期间都存在。

因为static变量是分配在静态存储区的,所以它的生存期为整个源程序,不会随着退出函数而消失。

从static修饰变量的位置可以分为以下三种:

①在函数外的变量,即静态全局变量,在全局变量前加static修饰符,那么它和非静态全局变量有什么区别呢?

静态全局变量VS非静态全局变量区别:静态全局变量限制了作用域,只能在定义该变量的源文件内有效;而非静态全局变量作用域为整个源程序,同一源程序下的多个源文件都有效。比如说,一个工程下有很多子编译文件,普通全局变量是在所有子编译文件中都可以使用,而静态全局变量只能在当前编译文件中使用。

 当然,无论是全局变量还是静态变量,它们都分配在静态存储区。

②在函数内的局部变量,即静态局部变量,它和普通的局部变量的区别是:普通局部变量是分配在栈上的,函数结束时它就会消失,假设一个函数调用了十次,那么这个变量会重新定义十次。而静态局部变量因为分配在静态存储区,所以只会被定义初始化一次,当函数被再一次调用时,它的值保持上一次使用最后保存的值。

③在类中使用的静态成员变量,类的静态成员属于整个类,从层次上就可以看出,它与普通成员变量的区别是,它不需要实例化就可以通过类名进行访问,它不属于某个对象,它可以被类的所有方法访问。并且,静态成员可以被任一对象修改,修改后的值被所有对象共享。

三、static使用场景---静态函数

1.静态函数如果用在类中,成为静态成员函数。只要在类中出现static,说明这个成员变量或者成员函数属于整个类,而不属于某个对象。我们说,静态函数因为在类实例化之前就已经加载到内存,而普通成员变量必须创建对象后才能使用,所以静态方法只能访问该类的静态成员。

2.除了修饰类的成员函数,static还可以修饰普通的函数。此时,静态函数只能在声明它的文件中使用,在其他文件中是不可见的,也可以把它叫作内部函数。这样的好处是,避免了多个文件下同名函数问题,因为普通函数默认是extern,外部函数。此外,static函数在内存中只有一份,普通函数在每次调用时维持一份拷贝。

四、static使用场景---修饰类

在Java中,有一种特殊的用法,用static来修饰内部类,普通的类是无法用static修饰的。被static修饰的内部类可以当做一个普通类来使用,不需要实例一个外部类。

五、静态、非静态的区别

静态与非静态的区别主要体现在以下几个方面:生存周期、内存分配、共享方式、调用方式、访问方式

1.生存周期

静态变量一直存在,直到程序的结束而销毁,但是局部变量在函数调用结束即销毁。

2.内存分配

静态变量分配在静态存储区,而非静态变量分配在栈、或者堆上。栈上存放的是由操作系统自动分配的变量,例如,局部变量,函数参数等;而堆上是由程序员主动分配释放的空间,例如链表等,当然在Java中也可以通过垃圾回收机制不定期回收。

3.共享方式

静态成员被类的所有对象共享,而非静态成员不共享。

4.调用方式

静态变量可以在实例化之前通过类名调用,而非静态变量要在实例化之后通过实例化的对象调用。

5.访问方式

静态方法只能访问静态成员;而非静态的方法可以访问静态成员,也可以访问非静态的成员。

六、静态的作用

静态的作用主要体现在两个方面:作用域和存储方式;

1.作用域,实现信息隐藏。使得全局变量和函数对其他文件不可见,同时避免了不同文件的命名冲突。

2.存储方式,静态存储方式,每次调用时初始值为上次调用的值,调用结束后存储空间不释放。可以保存局部变量内容的持久性。

同时提一句,静态变量如果不给初始值,那么系统会给它默认的初始值0,这点和全局变量类似。

猜你喜欢

转载自blog.csdn.net/Jaster_wisdom/article/details/81319690