[ 局部变量 & 全局变量 ]
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;
可以通过某一个对象名或类名调用静态成员;
静态函数只能访问静态成员变量, 也只能调用静态成员函数;
虚函数不可以是静态函数;
类的静态成员变量本质就是全局变量, 而静态成员函数本质就是全局函数. 之所以写在类中, 是为了更好地理解和维护 (不是同一类对象不可访问私有成员).
来源: http://www.bubuko.com/infodetail-3517737.html