static 在c和c++

来源:互联网 发布:万网域名指向花生壳 编辑:程序博客网 时间:2024/05/11 05:30

static
 在 c语言中:
在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量,该变量在全局数据区分配内存(静态局部变量也是的);
未经初始化的静态全局变量会被程序自动初始化为0,声明它的整个文件都是可见的,而在文件之外是不可见的;
这就是为什么全局变量可以定义在可被多个.C文件包含的头文件中, 在不同的C文件中以static形式来声明同名全局变量。每个文件只有自己可见

它,其它文件中可以定义相同名字的变量,不会发生冲突;
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式

。 这两者在存储方式上并无不同。这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局

变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使

用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。
把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范

围。  
有时候我们需要在两次调用之间对变量的值进行保存。通常的想法是定义一个全局变量来实现。但这样一来,变量已经不再属于函数本身了,不再

仅受函数的控制,给程序的维护带来不便。
静态局部变量正好可以解决这个问题。静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。

static局部变量和普通局部变量有什么区别:
static局部变量只被初始化一次,下一次依据上一次结果值; 程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据

存在于( 堆)中。

static函数与普通函数有什么区别:
static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝,
它只能在声明它的文件当中可见,不能被其它文件使用。意味着其它文件中可以定义相同名字的函数,不会发生冲突;

c++中的static :
引用静态数据成员时,采用如下格式:

   <类名>::<静态成员名>

非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员。无论这个类的对象被定义了多少个,静态数据成员在程序中也

只有一份拷 贝,由该类型的所有对象共享访问。也就是说,静态数据成员是该类的所有对象所共有的。各对象共享static成员变量。

静态数据成员一样,我们也可以创建一个静态成员函数,它为类的全部服务而不是为某一个类的具体对象服务。静态成员函数与静态数据成员一样

,都是类的内部 实现,属于类定义的一部分。普通的成员函数一般都隐含了一个this指针,this指针指向类的对象本身,因为普通成员函数总是具

体的属于某个类的具体对象的。静态成员函数由于不是与任何的对象相联系,因此它不具有this指 针。从这个意义上讲,它无法访问属于类对象的

非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数和访问静态的数据成员。反过来,非静态的成员函数能访问静态的

变量和函数。
 
编译器为它在栈上分配空间,大家知道,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,如何实现? 最容易想到的方法是定义一个全局的变量,但定义为一个全局变量有许多缺点,最明显的缺点是破坏了此变量的访问范围。需要一个数据对象或者函数为整个类而非某个对象服务,同时又力求不破坏类的封装性,即要求此成员隐藏在类的内部,对外不可见。

原创粉丝点击