【 局部变量 & 全局变量 】
1. 定义在函数内部的变量即为局部变量(包括函数的参数);定义在函数外部的变量即为全局变量(也称外部变量);
2.有效范围:
局部变量有效范围是从定义处到函数结束(或程序块结束);
全局变量有效范围是从定义处到所在文件结束,即同一文件的其他函数也可访问使用该变量。
【 存储类型 】
程序的局部变量存储在动态存储区中 (栈区),根据变量生命周期的开始和结束,系统会自动分配和释放存储空间。
全局变量存储在静态存储区,程序结束前内存不会被释放。
*【 static 】关键字
静态局部变量:局部变量前加static, 表示该变量可以被函数外部访问(要通过该函数),变量会被存储在静态存储区;静态局部变量只会被初始化一次。
静态外部变量:全局变量前加static, 表示该变量只可以被所在文件访问。(避免不同文件中有相同变量名而引起混乱)
-----------------------------------------------------------------------------------------------------------
* extern 关键字。
在一个源文件中,如果要使用另一个源文件中的全局变量,需要通过extern关键字声明。编译和链接时,系统会知道该变量在别处定义的全局变量,并将该变量的作用域扩展到该源文件。
若一个全局变量定义为static类型,则外部文件中即使使用extern声明,也无法访问该变量。
----------------------------------------------------------------------------------------------------------
【 内部函数 & 外部函数】
一般函数都为外部函数,即可以被其他源文件调用。其他源文件调用此函数时,需要先声明, Eg. extern void swap(int &a, int &b); (extern可省略)
//函数声明的意义,即告诉编译器此函数在之后或其他文件中已定义;函数原型声明可将函数作用于扩展到声明处及之后
函数前加static关键字后,函数变为内部函数,函数便只能被该文件调用。
* 【各类变量作用域和存在性小节】
变量/函数类型 | 作用域 | 生命周期 |
局部变量 | 函数内部 | 函数内部 |
静态局部变量 | 函数内部 | 程序运行期间 |
全局变量 | 本文件及extern声明该变量的文件 | 程序运行期间 |
静态全局变量 | 本文件 | 程序运行期间 |
外部函数 | 声明该函数的文件 | NA |
内部函数 | 定义该函数的文件 | NA |
----------------------------------------------------------------------------------------------------------
【 类的静态成员变量和静态函数 】
类中的成员变量和成员函数也可被static修饰,表示该类的对象都共享这些变量和函数;
计算一个对象size时,不包括静态成员变量的大小;
在包含类的静态成员变量的文件中,需要给这些变量声明和赋初值。Eg. static int myClass::myStaticVal = 1;
可以通过某一个对象名或类名调用静态成员;
静态函数只能访问静态成员变量, 也只能调用静态成员函数;
虚函数不可以是静态函数;
类的静态成员变量本质就是全局变量,而静态成员函数本质就是全局函数。之所以写在类中,是为了更好地理解和维护(不是同一类对象不可访问私有成员)。
原文:https://www.cnblogs.com/xiyang2020/p/12755490.html