C++中的变量:作用域、生命周期与关键字
全局变量与局部变量:定义、声明、初始化、作用域、生命周期与extern关键字
- 定义就是让编译器为变量分配存储空间。在一个程序中变量只能被定义一次
- 在定义变量后,变量代表这一块存储空间,初始化就是给变量这块存储空间指定初始值
- 在函数体外定义的变量都是全局变量,默认将以0或者按默认构造函数进行初始化
- 在函数体或语句块内部定义的变量称为局部变量,没有声明只有定义,定义的时候如果没有初始化将带来未知风险
- 不论是全局变量还是局部变量,内置类型还是类类型,都建议在定义的时候手动初始化,避免未知风险
- 局部变量在定义的那一行到这个作用域的结束处才可以访问,全局变量在声明的那一行到这个文件末尾都可以访问
- 局部变量没有声明,只有定义
- 声明(extern)和全局变量是完全挂钩的,声明必须加extern关键字。声明之后该全局变量将完全地可以被访问。
- 在函数体外,int a; 是定义全局变量,且默认初始化;只有加了extern才是声明,但是可以extern int a = 100; 此时是定义而不是声明;
- 在函数体内,int a; 是定义局部变量,且没有初始化,将屏蔽掉同名的全局变量;加了extern关键字则是声明全局变量,且不能含有初始化式(在局部作用域不可能定义全局变量,静态存储区都是定死的)
- 一般在.h文件中extern声明,然后其他源文件include这个头文件就能使用这个全局变量了
#include<iostream> using namespace std; int main(){ extern int a; cout << a << endl; // a在其他地方定义了,可以被打印出来 system("pause"); return 0; } int a = 100;
- 生命周期:全局变量的生命周期是整个程序的运行过程,进程一被创建就存在(未初始化或者默认初始化的全局变量在.bss段,已初始化的全局变量在.data数据段),进程结束后被释放;局部变量的生命周期是当前执行到的指令在局部变量的作用域内,在作用域结束时释放
- 在内存中的存放位置
- 初始化的全局变量在.data段(初始化的静态局部变量也在.data段)
- 未初始化的全局变量在.bss段(未初始化的静态局部变量也在.bss段)
- 局部变量在栈中,只有该局部变量所在的函数被调用时,局部变量才被压入栈
全局变量与局部变量:const/static/extern 关键字
- static关键字
- 修饰局部变量:作用域不变,生命周期变为整个进程。静态局部变量存放在静态存储区,.data/.bss中。
静态局部变量的初始化语句只有第一次进入该函数时才有效!如果不是第一次调用该函数,那么将忽略初始化式
-
- 修饰全局变量:感觉static就是设计给局部变量用的,勉为其难地给全局变量用:限定全局变量的作用域在本文件中
- 修饰函数:和全局变量相同
- const关键字
- const关键字修饰的变量必须被初始化,在定义后不可修改
总而言之,static修饰的全局/局部变量都存储在.data/.bss区中,const修饰的全局变量在只读数据段,局部变量仍在栈中