51Testing软件测试网C
k,KutD7W%s 对于C++中的变量存在着两种类型的不同形式。1、静态持续性变量;2、自动局部性变量51Testing软件测试网
wA@!h3N^d
51Testing软件测试网4p/~s,lmy|:M 那这两者有何区别呢?下面我们来一起分析一下,他们的异同点。
gJd;l1A,I0
51Testing软件测试网-G)c1x8Yl-xqW 1、静态持续性变量:51Testing软件测试网9W}$e
oP6`
fn
c
51Testing软件测试网6gc%g_LI;b AN 即此变量在程序的整个生命周期中一起存在,不管程序是否执行到相应的作用域。它一直存在,由于是静态的,所有它们并没有像其它自动局部变量(即
相应作用域内定义的变量,出了作用域变量自动销毁)那样,在特定的管理装置中管理维护(即栈中)。而是编译器直接分配固定的内存(因为程序在运行中静态持
续性变量的数目是固定的)。这也就是为什么要做静态持续性变量的原因了,不管你爱它还是恨它,只要程序在运行,它就存在。
F7vV$N5@,oL_0
51Testing软件测试网~9~ r*B'X7L? 2、自动局部性变量:
C4?/U#y"?B4o0
51Testing软件测试网'z*qh%wg;w*~ 即函数或代码块中定义的变量,随程序的控制权进入作用域时,变量自动创建并维护在栈中(后进先出的一种结构)。当程序的控制权退出相应作用域时,局部变量自己销毁。这也就是为什么取名自动局部变量的原因。因为它的喜怒哀乐,生杀大权存在于程序的行为。51Testing软件测试网V_8qM
E7l
}6EiK1I'c2P0 下面我们就来重点分析一下静态持续性变量,其实在C++中存在着有三种类型的静态持续性变量。51Testing软件测试网3Wg8g0Sx]Nk:o_l:PM
,M2y3f)W,|7I;OZ7~0 1、在任何函数体外声明的带static关键字的变量(作用域范围:声明处到此文件结束处,也称为单文件全局变量)。注意是在单个文件的声明处和文件结束处。这样的静态持续性变量只有在这个文件内可见,其它文件一律不可见(除非它以头文件的形式被源文件包含)。51Testing软件测试网%I1[2L4\ x3f
51Testing软件测试网7k"\Iz{B 2、在任何函数外声明的不带static关键字的变量(作用域范围:真正意义上的多文件内的全局变量)。也就是说这类变量在所有文件中都可见。
只要在其它文件当中用extern引用此变量,就可以直接拿来用。这种方式的变量有一个要特别注意的地方。就是当这种变量定义在头文件当中时,如果被其它
文件包含,此时只能被一个文件所包含(原因,C++具有单定义规则,即变量只能有一次定义。如果头文件被包含在了两个源代码文件中,那就是这两个源代码文
件中都具有了同一个变量的二次定义,所以编译器一定会报错)。
['n`;u4JTT?Q0
DY0^A R
[3a'P6h4x0 3、在函数体内或块中声明的带static关键字的变量(作用域:只有在相应的函数体内或块内可见) 。
K6Xv:A K5l4\%F0
0oV5@ z6l.e|b0 总结:单定义规则就是变量在相同的作用域范围内只能被定义一次。如果单文件作用域内的变量和多文件作用域内
的变量同名时,前者会隐藏多文件作用域同名变量。其原理与自动局部变量一样,函数内同名变量隐藏函数外的同名变量。但是,如果我们想在内函数中使用外函数
的同名全局变量,那我们就只能用::域作用符来引用全局变量(前面的二种静态持续性变量都为全局变量,唯一的不同点就是作用域一个是单文件范围内全局变
量,一个是多文件范围内的全局变量)。51Testing软件测试网wP/kT zO(Qg
*ikC$OtX;V4N0 代码示例:
5Cq(V,v"Ku!z4Q0
/K$L
fG[Q!v)ANW0 //为了说明方便,多文件范围内的全局变量我们称为外部全局变量,单文件范围内全局变量我们称为内部全局变量51Testing软件测试网F8t4AdLUy
Rkb r$A0 main.cpp源代码
D2J8x%f
[H*b0
Do4o/o(h%w]]:r0
%W
E-?dJ?0
51Testing软件测试网6z"x?1UwT4n+p8^7J #include <iostream>51Testing软件测试网k{1Bj;VG'f using namespace std;51Testing软件测试网$Dj'~(]h$v@
51Testing软件测试网+v,J%D W'f nr1v:ulint cat = 10;//外部全局变量
o;TDq7E(@/r0static int dog = 11;//内部全局变量 6q9l%U } G3^0int nick = 5;//定义外部全局变量 ye)dB-OT-j;v0
51Testing软件测试网m!k;k@7HzI fvoid remote_access();//函数原型 F0aeQ4w*JY0
5Os^1cI#YB^ E0int main(){51Testing软件测试网wcR"xAnE cout<<"cat = "<<cat<<" ,&cat = "<<&cat<<endl;51Testing软件测试网@5c+~P-m#Pu&w,t cout<<"dog = "<<dog<<" ,&dog = "<<&dog<<endl;51Testing软件测试网 Gg7E0}!? cout<<"nick = "<<nick<<" ,&nick = "<<&nick<<endl; MD2N#q6l'T
L^0 remote_access(); "^C7o~(_;Yh`&{%s0} v`2wK)W
[S0 |
51Testing软件测试网5Ss&q+l$Jr other.cpp源代码51Testing软件测试网-Ur)[d!dk;s5T
Dg5l&n(c'p&]0
51Testing软件测试网([$u*b
e8Ta'|g4O
51Testing软件测试网
W wH)fm&ZG0C%n #include <iostream> \.}*z2]$QR7{cU{N0extern int cat;//extern关键字声明引用main.cpp文件中的外部全局变量51Testing软件测试网3Hr+~5Mo5C
dw q^lR-a int dog = 3;//定义外部全局变量51Testing软件测试网"W;fn3S l
{X static int nick = 6;//内部全局变量隐藏外部全局变量 aEC7r^5u
s0
^2P:pq1o}-Y7g~)o\5_0void remote_access(){ 7U
L0GZ M-aQ`pE0 using namespace std;51Testing软件测试网C+YdHUe cout<<"cat = "<<cat<<" ,&cat = "<<&cat<<endl; a0Bv?;Sq0 cout<<"dog = "<<dog<<" ,&dog = "<<&dog<<endl; @T,g)M2R?0 cout<<"nick = "<<nick<<" ,&nick = "<<&nick<<endl; +O MsT$?:f@0}51Testing软件测试网i5X%C)k2{9_6w5C*R |
51Testing软件测试网U|~y!A7E%d 执行结果:
'Qkds"r.PE8H0
9mz2@+H6hY'L,W0 cat = 10 ,&cat = 00F9900051Testing软件测试网 fJm9w:LP
dog = 11 ,&dog = 00F99004
,DS
D.[C0 nick = 5 ,&nick = 00F9900851Testing软件测试网6C`9C)c:rlL R
cat = 10 ,&cat = 00F9900051Testing软件测试网$Wm
L*P?
?
dog = 3 ,&dog = 00F99010
zmU#p,[@g0 nick = 6 ,&nick = 00F9901451Testing软件测试网lq
r#H1P#M|