变量的作用域:(决定了变量的有效范围) 分为局部变量 和 全局变量
每个变量和函数都有2个属性:数据类型(作用域)和存储类别(生存期);在定义变量时要加以说明;
变量有效性范围称为作用域;
局部变量:函数内部定义的变量,作用域和生存期在函数内;main函数中定义的变量也只是在其函数内;
形参变量属于被调函数的局部变量,实参属于主调函数的局部变量;
复合语句内定义的变量只在复合语句内有用;
全局变量:
如果函数外部定义的变量是外部变量,
如果外部变量定义出现在文件的开始部分,它就是全局变量,外部变量不属于哪个函数,它可以为源文件中其他函数共用;
在局部变量的作用域内,外部变量不起作用;
////////////////////////////////////////////////////////////////////////////////////////////////////////
变量的存储类别:(决定了变量的生存期)
变量存储类别(存储方式):是指变量占用内存空间的方式;分为静态存储、动态存储;
静态是在程序运行期间分配固定的存储空间的方式;全局变量全部分配在静态存储区;
动态是在程序运行期间动态分配的存储空间的方式;
动态变量: 函数形参、自动变量(未加static的局部变量)、函数调用时 的现场保护和返回地址;--它们在函数结束时生命期就结束了;
C++ 有4种的存储类型:
outo :
函数、复合语句内未加存储类型说明的都属于自动变量,它的作用域是在函数体、复合语句内,生存期是在退出函数前,函数调用结束后,自动变量的值不能被保存;
函数体外、文件中定义的变量,是全局变量,
register:
需要反复循环使用的变量就可以定义成register变量,该类型的变量不用通过内存,而是直接在寄存器中访问,它可以提升软件的效率; 该变量不存放在内存中,它存放在cup的寄存器中,可以提升效率。
以上2种属于动态存储方式;
extern:
全局变量(作用域提出的)即为外部变量(存储方式提出的,表示了它的生存期);
如果定义该extern的变量所在的程序有多个源文件,则该变量也是被其他源文件可用,但要保含该变量所在的头文件;
如果全局变量(非函数内或者复合语句内的变量)之前不加extern ,则在外部文件是访问不到的,只有在定义它的文件里才能访问它;
定义一个类的全局对象的方法:在头文件中extern A a; 在cpp文件中去 A a; 然后在需要用到这个全局对象的文件中包含类A的头文件,这些类是整个程序都要用的唯一一份的全局变量,比如用于记录软件运行日志的类CLogofile。
如果extern变量前面没有加static,它的作用域是整个程序;加了static,则只在该文件里有用;
static :
函数内如果带static的变量,生存期就是整个程序退出时,该变量的值会保留到下次访问函数时;也就是说不随着函数的退出而被清空里面的的值;作用域是函数内;
函数外定义的static的变量,生存期也是整个程序退出时,该变量的值保留到下次访问到它时;作用域是变量所在的文件;
以上2种属于静态存储方式。