static浅谈

关于static的详细解释,参考http://baike.baidu.com/view/536145.htm

以下列出几个以前理解上的误区及盲点。

在定义函数或变量的时候,我们可以把它声明为静态的(static)。可以有静态全局变量和静态局部变量。

1. 静态全局变量在声明它的整个文件中都是可见的,而在文件之外是不可见的。也就是说,如果我们在A.cpp中定义了static int a;则变量a在这个A.cpp中都是可见的,在其他的文件中,如B.cpp中是不能访问的。利用这一特性,我们可以在不同的文件中,定义相同的变量,而不会相互影响。这在于大型的项目中是很重要的。通常在大型的项目中,每个人独自编写自己的函数,通过把变量或函数声明为static,就不用担心在链接的时候会发生的全局变量的命名冲突问题了。

2.对于一个完整的程序,它的存储空间一般包括如下四个部分:代码区,全局数据区,堆区,栈区。一般程序把新产生的动态数据放到堆区,临时变量一般放到栈区。全局变量,静态数据等一般存放在全局数据区。

3.全局变量和全局静态变量的区别

1)全局变量是不显式用static修饰的全局变量,但全局变量默认是动态的,作用域是整个工程,在一个文件内定义的全局变量,在另一个文件中,通过extern 全局变量名的声明,就可以使用全局变量。

2)全局静态变量是显式用static修饰的全局变量,作用域是所在的文件,其他的文件即使用extern声明也不能使用。

4. 对于面向对象的程序设计语言来说,有对象的概念,如果类中的某个数据成员被声明为静态的,则意味着它被当做类的成员,为该类的所有的对象所共享。对该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共 用。而对于非静态数据成员,每个类对象都有自己的拷贝。累的静态成员没有this指针,所以它仅能访问累的静态数据和静态成员函数。

 

 

关于静态成员函数,可以总结为以下几点:

(1)出现在类体外的函数定义不能指定关键字static;

(2)静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;

(3)非静态成员函数可以任意地访问静态成员函数和静态数据成员;

(4)静态成员函数不能访问非静态成员函数和非静态数据成员;

(5)由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长;

(6)调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,也可以直接使用如下格式:

  <类名>::<静态成员函数名>(<参数表>)

  调用类的静态成员函数。

 

posted @ 2012-06-07 22:11  菜鸟的世界  阅读(221)  评论(0编辑  收藏  举报