Chinaunix首页 | 论坛 | 博客
  • 博客访问: 210983
  • 博文数量: 58
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 11
  • 用 户 组: 普通用户
  • 注册时间: 2014-09-02 01:08
文章分类
文章存档

2020年(1)

2018年(2)

2017年(1)

2016年(7)

2015年(31)

2014年(16)

我的朋友

分类: C/C++

2015-09-01 18:43:05

个人牢骚:无奈,今天被人“鄙视”了,郁闷,看来要狠狠的打一下基础了。

全局变量与全局静态变量的区别:

(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来产生随机数


阅读(1283) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~