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修饰的全局变量在只读数据段,局部变量仍在栈中

posted @ 2019-08-03 15:40  LiaoQian1996  阅读(654)  评论(0编辑  收藏  举报