静态持续性变量与自动局部变量异同
作者:网络转载 发布时间:[ 2012/8/27 11:46:59 ] 推荐标签:
对于C++中的变量存在着两种类型的不同形式。1、静态持续性变量;2、自动局部性变量
那这两者有何区别呢?下面我们来一起分析一下,他们的异同点。
1、静态持续性变量:
即此变量在程序的整个生命周期中一起存在,不管程序是否执行到相应的作用域。它一直存在,由于是静态的,所有它们并没有像其它自动局部变量(即相应作用域内定义的变量,出了作用域变量自动销毁)那样,在特定的管理装置中管理维护(即栈中)。而是编译器直接分配固定的内存(因为程序在运行中静态持续性变量的数目是固定的)。这也是为什么要做静态持续性变量的原因了,不管你爱它还是恨它,只要程序在运行,它存在。
2、自动局部性变量:
即函数或代码块中定义的变量,随程序的控制权进入作用域时,变量自动创建并维护在栈中(后进先出的一种结构)。当程序的控制权退出相应作用域时,局部变量自己销毁。这也是为什么取名自动局部变量的原因。因为它的喜怒哀乐,生杀大权存在于程序的行为。
下面我们来重点分析一下静态持续性变量,其实在C++中存在着有三种类型的静态持续性变量。
1、在任何函数体外声明的带static关键字的变量(作用域范围:声明处到此文件结束处,也称为单文件全局变量)。注意是在单个文件的声明处和文件结束处。这样的静态持续性变量只有在这个文件内可见,其它文件一律不可见(除非它以头文件的形式被源文件包含)。
2、在任何函数外声明的不带static关键字的变量(作用域范围:真正意义上的多文件内的全局变量)。也是说这类变量在所有文件中都可见。只要在其它文件当中用extern引用此变量,可以直接拿来用。这种方式的变量有一个要特别注意的地方。是当这种变量定义在头文件当中时,如果被其它文件包含,此时只能被一个文件所包含(原因,C++具有单定义规则,即变量只能有一次定义。如果头文件被包含在了两个源代码文件中,那是这两个源代码文件中都具有了同一个变量的二次定义,所以编译器一定会报错)。
3、在函数体内或块中声明的带static关键字的变量(作用域:只有在相应的函数体内或块内可见) 。
总结:单定义规则是变量在相同的作用域范围内只能被定义一次。如果单文件作用域内的变量和多文件作用域内的变量同名时,前者会隐藏多文件作用域同名变量。其原理与自动局部变量一样,函数内同名变量隐藏函数外的同名变量。但是,如果我们想在内函数中使用外函数的同名全局变量,那我们只能用::域作用符来引用全局变量(前面的二种静态持续性变量都为全局变量,的不同点是作用域一个是单文件范围内全局变量,一个是多文件范围内的全局变量)。
代码示例:
//为了说明方便,多文件范围内的全局变量我们称为外部全局变量,单文件范围内全局变量我们称为内部全局变量
main.cpp源代码
#include <iostream>
using namespace std;
int cat = 10;//外部全局变量
static int dog = 11;//内部全局变量
int nick = 5;//定义外部全局变量
void remote_access();//函数原型
int main(){
cout<<"cat = "<<cat<<" ,&cat = "<<&cat<<endl;
cout<<"dog = "<<dog<<" ,&dog = "<<&dog<<endl;
cout<<"nick = "<<nick<<" ,&nick = "<<&nick<<endl;
remote_access();
}
other.cpp源代码
#include <iostream>
extern int cat;//extern关键字声明引用main.cpp文件中的外部全局变量
int dog = 3;//定义外部全局变量
static int nick = 6;//内部全局变量隐藏外部全局变量
void remote_access(){
using namespace std;
cout<<"cat = "<<cat<<" ,&cat = "<<&cat<<endl;
cout<<"dog = "<<dog<<" ,&dog = "<<&dog<<endl;
cout<<"nick = "<<nick<<" ,&nick = "<<&nick<<endl;
}
执行结果:
cat = 10 ,&cat = 00F99000
dog = 11 ,&dog = 00F99004
nick = 5 ,&nick = 00F99008
cat = 10 ,&cat = 00F99000
dog = 3 ,&dog = 00F99010
nick = 6 ,&nick = 00F99014
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11