c语言c++语言中静态变量,函数详解

静态变量,静态函数对于一些c,c++的初学者来说,造成了不少的困扰。昨晚和寝室的室友讨论到这

个问题,想了一下,作了一下总结:
虽然说c和c++在很多人的眼里就是孪生姐妹,其实还是有很大区别的。在这里分别谈论在c和c++中静

态成员和静态函数的区别:

c中:
在介绍之前,先说说变量的生存周期和作用域,很多人对这个概念很陌生,或者是ambiguous。
生存周期:是从时间概念上来说,变量在程序启动后,从时间a到时间b这段时间中,变量一直存在于

内存中,那么a->b称为变量的生存周期。它在时间上时连续的,在空间上可以不连续,也就是说,它

可能在a->b这段时间内,程序运行到某段区域,我们无法对变量进行访问,但是,它却是实实在在的

存在于内存中,没有销毁。
作用域:是空间上的概念,是指变量在生存周期内的一个概念,当程序在变量的生存周期a->b内,运

行到某段区域时,该变量如果可操作,那么称这段区域为作用域。

1.static变量:
1)局部:
静态局部变量在函数内定义,生存周期为整个源程序,但作用域与自动变量相同,即只能在函数的作

用于中。退出该函数后,就无法使用了。
2)全局:
全局变量本身就是静态存储方式,当然全局static变量也是静态存储方式。但是他们的作用域是整个

源程序,自动全局变量的作用于也是整个程序,但是这里需要注意的是,如果只有一个源文件,那么

全局静态变量和全局自动变量非常类似,但是如果有多个源文件,那么全局static变量的作用于仅限

于定义所在的源文件,在其他的文件中是无法使用的。就是说在不同的文件中可以定义名称相同的全

局static变量。

2.static函数
static函数在c中也叫内部函数,因为static修饰的函数无法再其它文件中使用,
在介绍之前,先讨论一下 堆,栈,自由存储区,全局/静态存储区和常量存储区
堆:用new分配,free释放
自由存储区:malloc分配,delete释放
栈:编译器管理的局部变量和函数参数等。
全局/静态存储区:存储静态变量和全局变量
字符常量区:常量存储的内存
也就是说static修饰函数的仅有一个意思:就是告诉编译器,我是一个内部函数,不要随便的用我。

(这里插入一个小片段,以前我一直以为c语言中的static函数中只能使用static变量,在今天总结

的时候,发现是错的,呵呵。。)


下面再来看看c++中的static变量和static成员函数:
先看个有趣的例子:
class test
{
private:
static int a;
public:
test(){}
}
int test::a=2;//ok,
void main()
{
cout<<test::a<<endl;//error,因为a是一个private成员函数,可能细心的读者就会问了,为什么

前面的赋初始值可以完成,后面的输出却不行,这里要注意:static成员变量设置初值的时候,不受

任何权限的束缚。但是这里需要解释的是,并不是在任何时候都不受束缚,仅仅在赋初始值的时候不

受权限束缚,如果是在中途改变static成员变量的值的话,必须是public类型的才能改变,否则编译

错误。
例如:
如果
main()
{
test::a=3;//这一句就必须要求static a是public类型的。
}
}
静态成员有一个好处就是在一个对象都没有构造的时候就可以对该变量进行访问。
注意:static成员函数,由于static成员函数并不包含this指针,所以无法对类的非static成员变量

进行任何操作。并且static成员函数是无法声明为const类型的,因为const就是说不会修改该函数所

属的对象,由于static根本就不属于哪个对象,所以会造成编译错误。

posted @ 2011-03-06 16:51  luck_net  阅读(806)  评论(0编辑  收藏  举报