分类: C/C++
2015-09-01 18:43:05
原文地址:全局变量与全局静态变量的区别 作者:ybu2008
全局变量与全局静态变量的区别:
(a)若程序由一个源文件构成时,全局变量与全局静态变量没有区别。
(b)若程序由多个源文件构成时,全局变量与全局静态变量不同:全局静态变量使得该变量成为定义该变量的源文件所独享,即:全局静态变量对组成该程序的其它源文件是无效的。
静态全局变量的作用:
(a)不必担心其它源文件使用相同变量名,彼此相互独立。
(b)在某源文件中定义的静态全局变量不能被其他源文件使用或修改。
例如:一个程序由两个源文件组成,其中在一个源文件中定义了“int n;”,在另一个源文件中定义了“static int n;”则程序给它们分别分配了不同的空间,两个值互不干扰。
例如:下面在file1.cpp中声明全局变量n,在file2.cpp中定义全局静态变量n。文件file1.cpp和file2.cpp单独编译都能通过,但连接时,file1.cpp中的变量n找不到定义,产生连接错误。
// file1.cpp
# include
void fn()
extern int n;
void main()
{
n=20;
cout< fn(); } // file2.cpp # include static int n; // 默认初始化为0,注意此处定义的n 只能在file2.cpp中使用。 void fn() { n++; cout< } 静态函数:使某个函数只在一个源文件中有效,不能被其他源文件所用。 定义:在函数前面加上static。 说明:函数的声明和定义默认情况下在整个程序中是extern的。 静态函数的效果: (1)它允其他源文件建立并使用同名的函数,而不相互冲突。 (2) 声明为静态的函数不能被其他源文件所调用,因为它的名字不能得到。 拙见: 静态变量和函数一般都局限于一个编译单元也就是.cpp文件中。 我想这是最主要的区别。 续:
静态变量和私有变量的最主要的区别就在于:他们分配内存空间的方式不一样。 静态变量的内存是在程序开始执时变量就占用了内存,直到程序结束时变量才释放内存. 私有变量(或者说是局部变量,不知道你是不是指这个:)),是在程序运行到该步的时候分配内存。所以,当离开了该私有变量的作用域的时候,私有变量的内存空间会被释放。 所以:静态变量只的值只会初始化一次,后面每次访问,都是上次处理过的值,(即使是在一个函数内部)。 私有变量每次都初始化。 看下面的实践: class Program { static void Main(string[] args) {//输出未经定义的静态变量,结果为0;也说明了,在C#中未赋初值的变量系统自动赋为0 Console.WriteLine(sort.i); //静态变量的访问方法(类名.静态变量名),而且还可以在外部操作静态变量呢,可见静态变量并不神秘; sort.i = 5; //输出5 Console.WriteLine(sort.i); //还可以通过构造函数对静态变量初值呢,呵 sort sortTest = new sort(); //输出构造函数中的赋值 3; Console.WriteLine(sort.i); } } class sort { public static int i; public sort() { i = 3; } } 总结:在类内部访问静态变量时,直接用静态变量名即可,不用以(类名.静态变量名),这样的方式访问, 除了有静态变量之外,还有静态类实例,还有静态方法.但用法都是大同小异;(没有静态类哦,呵呵越论越傻了) 如:public static void myFun(){} //静态方法 private static Random MyRandom=new Random(); //静态类实例 之所以有时声明为私有静态变量,是为了让它只初始化一次.这样节省了内存空间 但又想让它在外部是不可访问的,这样利用私有这个访问限定符就搞定了. 私有静态:安全又节省空间. 例:如果想在每次实例化类的时间生成一组随机数,但产生随机数是要用到一个类的,即Random,这个类不是静态类,它要产生实例,用产生的实例来生成随机数,但如果在每次类实例化时都产生一个Random实例,那内存空间简直是极大的浪费,所以可以用: private static Random MyRandom=new Random(); 这样每次类实例化时,都会用同一个Random实例MyRandom来产生随机数