内存分区
1)堆:由程序员手动分配和释放,完全不同于数据结构中的堆,分配方式类似链表,若程序员不释放,程序运行结束时由操作系统释放。
2)栈:由编译器自动分配和释放,存放函数的参数值、局部变量值等,操作方式类似数据结构中的栈。
3)全局(静态)存储区:存放全局变量和静态变量,包括DATA段(全局初始化区)和BSS段(全局未初始化区),程序结束后由系统释放。其中,BSS段的特点是在程序执行之前BSS段会自动清0,所以未初始化的全局变量与静态变量在程序执行之前已经初始化为0值了。
4)文字常量区:常量字符串、字面常量就是存放在这里的,程序结束后由操作系统释放。
5)程序代码区:存放函数体的二进制代码。
对于函数和变量来说
1)第一个作用:隐蔽,对于全局变量和全局函数来说,在a.cpp中定义的,在b.cpp中也可以使用,但是加上static修饰后,在b.cpp中就无法使用了。
2)第二个作用:默认初始化为0(对于变量有效,局部和全局)。
3)第三个作用:保持局部变量内容的持久。
对于类来说
表示属于一个类而不是属于此类的任何特定对象的变量和函数。
静态成员变量:
1)static成员变量独立于该类的任意对象而存在,也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其他所有实例所见。
2)不能在类声明中定义,static数据成员必须在类定义体的外部定义并初始化,但有一个例外,就是有const修饰的static成员变量可以在类的定义体中进行初始化。
静态成员函数:
1)静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数,静态成员函数不能访问非静态成员函数和非静态数据成员,非静态成员函数可以任意地访问静态成员函数和静态数据成员。
2)由于没有this指针的开销,因此静态成员函数与类的非静态成员函数相比速度上会有少许的差别。
3)static成员函数不能被声明为const,毕竟将成员函数声明为const就是承诺不会修改该函数所属的对象,而static成员函数不属于任何对象。
static修饰的局部变量为静态局部变量
特点:
1、生存周期为整个程序的生命周期 。
2、访问范围和普通变量是一样的。
3、static修饰的局部变量它的数值是上一次函数调用结束之后的数值。
4、static还可以修饰全局变量或者函数,静态局部变量在定义的时候没有初始化,系统会给定0为默认的初始值。
5、如果涉及到多文件操作的时候,用static修饰的全局变量,这个全局变量只能是在本文件中使用,static修饰函数的时候一样,表示限定使用范围只能够是在本文件中使用。
6、普通的局部变量是在栈上面分配空间的,是系统分配以及负责释放回收的,而全局变量、静态局部变量实际上是在静态存储区上分配空间的 。