51Testing软件测试网7V]
}+vg]ex0[$o^ 对于C++中的变量存在着两种类型的不同形式。1、静态持续性变量;2、自动局部性变量
Bp/HM*h:^|}0
+{p7O9bu7L-p0 那这两者有何区别呢?下面我们来一起分析一下,他们的异同点。
Q&d~7jl~0
*IRYC%b0 1、静态持续性变量:
:fT'bXd O5weY0
51Testing软件测试网z'H
?Ww3y~G 即此变量在程序的整个生命周期中一起存在,不管程序是否执行到相应的作用域。它一直存在,由于是静态的,所有它们并没有像其它自动局部变量(即
相应作用域内定义的变量,出了作用域变量自动销毁)那样,在特定的管理装置中管理维护(即栈中)。而是编译器直接分配固定的内存(因为程序在运行中静态持
续性变量的数目是固定的)。这也就是为什么要做静态持续性变量的原因了,不管你爱它还是恨它,只要程序在运行,它就存在。51Testing软件测试网6`E;aFv@D
51Testing软件测试网lJ_~*}0|:~ 2、自动局部性变量:
,[ds(U.Fca1R6Qp4Q0
)Wr^\-y.{
H'Qg0 即函数或代码块中定义的变量,随程序的控制权进入作用域时,变量自动创建并维护在栈中(后进先出的一种结构)。当程序的控制权退出相应作用域时,局部变量自己销毁。这也就是为什么取名自动局部变量的原因。因为它的喜怒哀乐,生杀大权存在于程序的行为。
!BON*k%wQ0Ji0
~#T'?)c.K1Y\0 下面我们就来重点分析一下静态持续性变量,其实在C++中存在着有三种类型的静态持续性变量。51Testing软件测试网VHv)I(qa
51Testing软件测试网Iy+T{{~tf 1、在任何函数体外声明的带static关键字的变量(作用域范围:声明处到此文件结束处,也称为单文件全局变量)。注意是在单个文件的声明处和文件结束处。这样的静态持续性变量只有在这个文件内可见,其它文件一律不可见(除非它以头文件的形式被源文件包含)。
QaXf WK:l0
51Testing软件测试网`nF[9TN9R;v.K-[ 2、在任何函数外声明的不带static关键字的变量(作用域范围:真正意义上的多文件内的全局变量)。也就是说这类变量在所有文件中都可见。
只要在其它文件当中用extern引用此变量,就可以直接拿来用。这种方式的变量有一个要特别注意的地方。就是当这种变量定义在头文件当中时,如果被其它
文件包含,此时只能被一个文件所包含(原因,C++具有单定义规则,即变量只能有一次定义。如果头文件被包含在了两个源代码文件中,那就是这两个源代码文
件中都具有了同一个变量的二次定义,所以编译器一定会报错)。51Testing软件测试网6zr!lr9Q%G
51Testing软件测试网"{G8_h`} 3、在函数体内或块中声明的带static关键字的变量(作用域:只有在相应的函数体内或块内可见) 。51Testing软件测试网;Y,A U C)_%~i1}T
51Testing软件测试网5|O k8Zr,YT 总结:单定义规则就是变量在相同的作用域范围内只能被定义一次。如果单文件作用域内的变量和多文件作用域内
的变量同名时,前者会隐藏多文件作用域同名变量。其原理与自动局部变量一样,函数内同名变量隐藏函数外的同名变量。但是,如果我们想在内函数中使用外函数
的同名全局变量,那我们就只能用::域作用符来引用全局变量(前面的二种静态持续性变量都为全局变量,唯一的不同点就是作用域一个是单文件范围内全局变
量,一个是多文件范围内的全局变量)。
8D6_-UsS5A)`/D0
51Testing软件测试网Ho_3Ms Lnl'k9`,Q ~ 代码示例:
FcWe ^?}X0
'{5~5[:oD
d[{u0 //为了说明方便,多文件范围内的全局变量我们称为外部全局变量,单文件范围内全局变量我们称为内部全局变量
*fO8WPOT2a!\0
51Testing软件测试网y(X}4bD)n1r main.cpp源代码51Testing软件测试网9Vu
X*M+]Y`'LX.O
x)mm%h4d(m}|0
l&v*Yz
vP0
A Z#@N(T/~4X`!Y0#include <iostream>51Testing软件测试网+B4vb7lG+Iy)A using namespace std;51Testing软件测试网#H
rNa{Mn
51Testing软件测试网Gf }a.h/NoUo7uint cat = 10;//外部全局变量51Testing软件测试网1@5eK'|Wp static int dog = 11;//内部全局变量 ;W H7f7L
Lr4wq M5W0int nick = 5;//定义外部全局变量51Testing软件测试网
ft#nV\hC
51Testing软件测试网2rJ
P,Q:?g Lvoid remote_access();//函数原型 :Nh
s5EK.s:SKM*mZ0
U:_{nn0{_v7U0int main(){ 2{@(P3AH0 cout<<"cat = "<<cat<<" ,&cat = "<<&cat<<endl; |7pC0?Y0 cout<<"dog = "<<dog<<" ,&dog = "<<&dog<<endl;51Testing软件测试网GVm'PP r$N0_n cout<<"nick = "<<nick<<" ,&nick = "<<&nick<<endl; px7@ZS7r.Z0 remote_access();51Testing软件测试网k$e
n4w`8xv\ } 'qC6Hm1n"V7M0 |
51Testing软件测试网T%~(P:T4Fa~4i~m other.cpp源代码51Testing软件测试网*i.o
Qs6sH"CjFz
^1_ Xb&ng2D0
51Testing软件测试网'R7I'K0g
~Q0x(lL
I
)H+Z.Y#p`
u/om3u0#include <iostream> B$rgh4K*M0extern int cat;//extern关键字声明引用main.cpp文件中的外部全局变量51Testing软件测试网*s d?2w.YZ int dog = 3;//定义外部全局变量51Testing软件测试网6m6LG2@E#T static int nick = 6;//内部全局变量隐藏外部全局变量 ]{.o!M,xN[
I0y6F0
51Testing软件测试网*Nc'JSAnivoid remote_access(){51Testing软件测试网%V'C%qC/EZ using namespace std;51Testing软件测试网[ti`w6y cout<<"cat = "<<cat<<" ,&cat = "<<&cat<<endl;51Testing软件测试网:u3F)A5X4u.C/L7Z)w cout<<"dog = "<<dog<<" ,&dog = "<<&dog<<endl;51Testing软件测试网&y0X2` `3xp cout<<"nick = "<<nick<<" ,&nick = "<<&nick<<endl;51Testing软件测试网8I3d~"K*Qu$Nkg } +E:A9T'~\0 |
51Testing软件测试网(xWLj)nn 执行结果:
IGy~%GM7?
D"L0
+iU~Ie0 cat = 10 ,&cat = 00F9900051Testing软件测试网M,d b.w;YY*`'F^@
dog = 11 ,&dog = 00F9900451Testing软件测试网5}3D%}jv&~`9{O
nick = 5 ,&nick = 00F9900851Testing软件测试网{-^3V$xvW4Q
x0kP1ecHt
cat = 10 ,&cat = 00F99000
0h8s
dAl(d#n0 dog = 3 ,&dog = 00F99010
)y*B E3`/w/Y0 nick = 6 ,&nick = 00F99014
"KUs,@+o)M0