C++中static函数与static变量的区别

#include <iostream>
using namespace std;

static void display()
{
int i=1;
cout<<"i="<<i<<endl;
i++;
}

void main()
{
for(int z=1;z<=10;z++){
display();
}
}

这个的程序的结果是10次:1
如果把display()函数改为
void display()
{
static int i=1;
cout<<"i="<<i<<endl;
i++;
}
结果是:1,23......10

请高数解答其中的奥妙!谢谢、。。。

全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误.
1.静态函数有两种,类中的成员函数和你说的这种,就是全局的,静态的全局函数表示只能被当前“.cpp”文件所使用,当外部用extern关键字声明之后也是无法使用的,如果不是静态函数,外部只要用extren声明一次就可以调用这个函数了;

2.静态变量要分为3种,a.类中的成员;b.函数中的静态变量;c.静态全局变量;
静态全局变量和静态全局函数一样,只能被包含的“.cpp”文件调用,外部无法用extern声明并使用;类中的成员其实可以当作一个全局变量,不过它的特点是只能用在该类里面,它并不属于任何一个成员,而是属于整个类;

static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝.

在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。
1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)
2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
3)作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。

c语言中static的语义
1.static变量:
1).局部
a.静态局部变量在函数内定义,生存期为整个源程序,但作用域与自动变量相同,只能在定义该变量的函数内使用。退出该函数后, 尽管该变量还继续存在,但不能使用它。
b.对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。

2).全局全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。但是他们的作用域,非静态全局 变量的作用域是整个源程序(多个源文件可以共同使用); 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。
2.static函数(也叫内部函数)
只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。区别于一般的非静态函数(外部函数) static在c里面可以用来修饰变量,也可以用来修饰函数。 先看用来修饰变量的时候。变量在c里面可分为存在全局数据区、栈和堆里。其实我们平时所说的堆栈是栈而不包含对,不要弄混。
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-05-21
1.静态函数有两种,类中的成员函数和你说的这种,就是全局的,静态的全局函数表示只能被当前“.cpp”文件所使用,当外部用extern关键字声明之后也是无法使用的,如果不是静态函数,外部只要用extren声明一次就可以调用这个函数了;

2.静态变量要分为3种,a.类中的成员;b.函数中的静态变量;c.静态全局变量;
静态全局变量和静态全局函数一样,只能被包含的“.cpp”文件调用,外部无法用extern声明并使用;类中的成员其实可以当作一个全局变量,不过它的特点是只能用在该类里面,它并不属于任何一个成员,而是属于整个类;
接下来是你说的函数中的静态变量,其实也和类中的差不多,可以把它当作全局变量使用,但特殊的是这个全局变量只能在该函数内使用。

比如,你的第二种情况,如果函数中删去“static int i=1;”,然后增加一个全局变量int i = 1;,运行结果是一样的,即1.2.3......10,但是如果改成全局变量,不仅能在函数外部使用这个变量,还能在外部用extern关键字声明“extern int i;”之后再使用该变量,这样会造成数据的不安全性。本回答被提问者采纳
第2个回答  2019-06-07
在函数中用static声明的变量类似于全局变量,所有函数访问到的都是同一个变量,就是说前一个函数改变了这个变量的值,其他函数再访问时就是改变之后的值了
第3个回答  2011-05-21
1:前面你用的是static成员函数,该static关键字在此处的意思是:该函数属于整个类的,不是在某一个具体对象的,也就是说你可以通过类名::函数名来调用。注意:静态成员函数中不能引用非静态的成员变量。
2:后面的static修饰的是局部变量,也就是说 i 在函数里面每次的值,增加之后是不变的。原因是:
static 是在静态数据存储区上分配内存。而普通的局部变量是在栈上分配内存,也就是说如果 i 是在栈上分配内存的话,每次函数调用完成之后,就会收回内存,i 的值每次都为1.

c++ const和static有什么区别?
static的作用是把一个变量(这里的变量和上面说的概念一样,都是泛指)设置为“静态”。一般情况下,我们在子程序中定义的变量,在这个子程序运行 结束的时候都会被销毁,其值就丢失了。如果用了static,则这个变量的值在子程序结束后依然被保留 。这个变量是否被销毁我不知道,但其值肯定被保留了。当...

static 变量 和 static 函数各有什么特点
1)、变量放程序全局存储区调用候保持原赋值点与堆栈变量堆变量区别 2)、变量用static告知编译器自仅仅变量作用范围内见点与全局变量区别 Tips:A.若全局变量仅单C文件访问则变量修改静态全局变量降低模块间耦合度;B.若全局变量仅由单函数访问则变量改该函数静态局部变量降低模块间耦合度;C.设计使用访问态...

const与static有什么区别
static 是c++中非常常用的修饰符,他被用来控制变量的存储方式和可见性,下面我将从 static 修饰符的产生原因、作用谈起,全方面分析static 修饰符的实质。static 的两大作用:一、控制存储方式:static被引入以告知编译器,将变量存储在程式的静态存储区而非栈上空间。1、引出原因:函数内部定义的变量,...

static 变量 和 static 函数各有什么特点
那么在函数内声明的静态变量和函数中的局部变量有什么区别呢?区别就是静态变量只有第一次运行函数的时候被创建,并且在函数结束的时候不会消亡;而普通的成员在函数结束的时候就会在内存中退栈消亡。说了那么多,举个例子:\/\/ex_1.c void fun_1 (){ static int a = 0;a ++;printf ("%d",a)...

static const和const static的区别
对于C\/C++语言来讲,const就是只读的意思,只在声明中使用;static一般有2个作用,规定作用域和存储方式.对于局部变量,static规定其为静态存储方式,每次调用的初始值为上一次调用的值,调用结束后存储空间不释放;对于全局变量,如果以文件划分作用域的话,此变量只在当前文件可见;对于static函数也是在当前模块内...

C++中“实例”是什么意思?另外提问关于static和const的区别。
static静态型,可以定义变量或函数等,表明这个部分是计算机不能动态搬 移的,需要固定地址使用,比如在函数内开设了一个静态变量a,那么你在函数 中多次操作这个a,它的值都会一直被记录下来,不会随函数退出而丢失。比如 可以用来记录本函数被调用了多少次。const常量型,只读型数据,不允许写操作(重新...

c++中的常量和静态有什么区别?
常量是说:“不能修改!或强烈建议别修改!”,const仅说明变量(或者函数)的不可修改性(或不修改别人)。静态是说:“它是在静态数据区的变量”,static影响变量的作用域和存储域。实际上,C++标准不赞成在名称空间和全局作用域中使用关键字static(该标准使用“不赞成”表明,这种做法,目前合法,但...

c++ const static和static const有什么区别?
static 分几中情况。1。限定定义类成员时表明该成员是所有该类对象共享的,只有一个,而不属于某个特定的对象。所以要这样引用 classname::varname;2。限定非类成员的变量时,只定义一次,忽略重复的定义。相当于全局变量,const static 与 static const 相同,意义就是把2者结合...

如何理解c++中的关键字static,const,以及#define在定义
static含义复杂,有三种含义:应用于全局变量时,表示每个编译单元独立实例化变量。若分别编译foo.cpp与bar.cpp后链接,全局变量a将有两份,分别由函数各自操作。应用于函数内局部变量,表示其生存周期为全局,但在函数内可见。每次函数调用,将获得不同的int值。初始赋值操作仅在首次调用时执行。应用于类...

在线等待:关于C++中static和const的区别.
一个变量按存储方法分为auto static register extern四种。其中static可以声明局部变量也可以声明全局变量。当声明局部变量时表示局部变量的值在函数调用结束时不消失而保留原值。const表示只读,被其限定的标量不能改变,但在函数调用结束时消失。const int a;(称谓常变量)这种写法有点问题。当定义常变量...

相似回答