C++_Static使用

合集下载

static在c中的用法

static在c中的用法

static在C中的用法在C语言中,static是一个关键字,用于修饰变量、函数和块作用域。

它可以改变它所修饰实体的生命周期、作用域和可见性。

本文将介绍static关键字在C语言中的多种用法。

1. 静态变量使用static关键字修饰的变量被称为静态变量(Static Variables)。

静态变量具有以下特点:•静态变量存储在静态数据区,不随函数调用结束而销毁;•静态变量的作用域局限于定义它的代码块;•静态变量只能被初始化一次,在整个程序运行期间保持其值。

下面是一个示例,展示了静态变量的使用:#include <stdio.h>void increment() {static int count = 0; // 静态变量countcount++;printf("Count: %d\n", count);}int main() {increment(); // 输出:Count: 1increment(); // 输出:Count: 2increment(); // 输出:Count: 3return 0;}在上述示例中,函数increment()内部定义了一个静态变量count。

每次调用该函数时,count会自增,并输出当前值。

由于静态变量的生命周期不受函数调用的影响,所以每次调用increment()时,count的值都会被保留。

2. 静态函数使用static关键字修饰的函数被称为静态函数(Static Functions)。

静态函数具有以下特点:•静态函数只在定义它的源文件中可见,不能被其他源文件调用;•静态函数不能被其他源文件通过函数指针调用;•静态函数不会与其他源文件中同名的全局函数产生冲突。

下面是一个示例,展示了静态函数的使用:#include <stdio.h>static void printMessage() {printf("This is a static function.\n");}int main() {printMessage(); // 正常调用静态函数return 0;}在上述示例中,我们定义了一个静态函数printMessage()。

c语言 static函数

c语言 static函数

c语言 static函数
C语言中的static关键字是一个有用的工具,用于控制函数和变量的作用域,以及被调用的次数。

它可以被用来修饰全局变量、局部变量、函数和文件中的变量。

全局变量可以使用static关键字修饰,这样可以将变量的作用域限制在定义它的文件中。

这样,其他文件就不能访问这个变量,因此可以避免变量之间的冲突。

static也可以用来修饰局部变量,这样可以将变量的作用域限制在其定义的函数中。

这样,每次调用函数,变量的值都不会改变,即使函数返回后,变量的值仍然保持不变。

static也可以用来修饰函数,这样可以将函数的作用域限制在定义它的文件中。

因此,其他文件不能调用这个函数,这样就可以避免函数名冲突。

static还可以用来修饰变量,以限制变量的作用域。

如果不使用static,变量可能会被其他文件调用,但如果使用static,变量的作用域就会被限制在定义它的文件中,因此可以避免变量之间的冲突。

static关键字是一个有用的工具,可以有效地控制函数和变量的作用域,以及被调用的次数,从而避免函数和变量之间的冲突。

因此,使用static关键字是一种有效的编程技巧,有助于编写出高效、可
靠的程序。

C中的static用法

C中的static用法

C++中的static简介C#与C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。

前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。

面向过程设计中的static1、静态全局变量在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。

我们先举一个静态全局变量的例子,如下://Example 1#include <iostream.h>void fn();static int n; //定义静态全局变量void main(){ n=20;cout<<n<<endl;fn();}void fn(){ n++;cout<<n<<endl;}静态全局变量有以下特点:该变量在全局数据区分配内存;未经初始化的静态全局变量会被程序自动初始化为0(在函数体内声明的自动变量的值是随机的,除非它被显式初始化,而在函数体外被声明的自动变量也会被初始化为0);静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的;静态变量都在全局数据区分配内存,包括后面将要提到的静态局部变量。

对于一个完整的程序,在内存中的分布情况如下图:代码区 //low address全局数据区堆区栈区 //high address一般程序把新产生的动态数据存放在堆区,函数内部的自动变量存放在栈区。

自动变量一般会随着函数的退出而释放空间,静态数据(即使是函数内部的静态局部变量)也存放在全局数据区。

全局数据区的数据并不会因为函数的退出而释放空间。

细心的读者可能会发现,Example 1中的代码中将static int n; //定义静态全局变量改为int n; //定义全局变量程序照样正常运行。

的确,定义全局变量就可以实现变量在文件中的共享,但定义静态全局变量还有以下好处:静态全局变量不能被其它文件所用;其它文件中可以定义相同名字的变量,不会发生冲突;您可以将上述示例代码改为如下://Example 2//File1#include <iostream.h>void fn();static int n; //定义静态全局变量void main(){ n=20;cout<<n<<endl;fn();}//File2#include <iostream.h>extern int n;void fn(){ n++;cout<<n<<endl;}编译并运行Example 2,您就会发现上述代码可以分别通过编译,但运行时出现错误。

c中static的作用

c中static的作用

c中static的作用嘿,朋友!想象一下这样一个场景,你正在一个充满代码的神奇世界里闯荡,就像在一个复杂的迷宫中寻找出口。

而在这个代码世界里,有一个神秘的角色,那就是“C 语言中的static”。

在一个小小的编程团队里,有新手小明,经验丰富的老张,还有严谨认真的组长王姐。

这天,小明正对着电脑屏幕,眉头紧锁,嘴里还嘟囔着:“这代码怎么就不对呢?”老张凑过来一看,笑着说:“小明啊,你这代码里要是能用上 static ,说不定就能解决问题啦!”小明一脸迷茫:“啥是 static 啊?”老张清了清嗓子,开始给小明解释:“这 static 啊,就像是一个忠诚的卫士。

你看,一般的变量,在函数调用结束后就消失得无影无踪,就像一阵风,吹过就没了。

可要是加上static ,那它就变得特别‘长情’,不会轻易离开,一直坚守在那里,等待着下一次被调用。

”小明似懂非懂地点点头。

王姐也走过来,接过话茬:“没错,小明。

比如说,咱们在一个函数内部定义了一个 static 变量,它的值会在函数多次调用之间保留下来。

这就好比你有一个存钱罐,每次往里放钱,钱都不会跑掉,下次打开还是在那里。

”老张接着说:“还有啊,static 修饰的全局变量,就像是一个被藏在城堡深处的宝藏,只能在这个文件里被访问,其他文件可没法轻易找到它。

这能避免一些意外的修改和混乱,是不是很神奇?”小明眼睛一亮:“原来是这样!”再说说 static 修饰的函数。

这就好比是一个私人派对,只有被邀请的人能参加。

被 static 修饰的函数,只能在所在的文件里被调用,别的文件可进不来这个“派对”。

你想想,如果没有 static ,那代码世界得多混乱啊!变量和函数到处乱跑,数据可能被随意修改,那简直就是一场灾难!所以啊,C 语言中的 static 可太重要啦!它就像一个秩序维护者,让代码世界变得井井有条,稳定可靠。

它让变量和函数能够各司其职,发挥出最大的作用。

朋友,现在你是不是对 C 语言中的 static 有了更清晰的认识呢?。

c中static的作用和用法

c中static的作用和用法

一、static的基本概念二、static的作用1. 控制变量的作用域2. 保持变量的持久性3. 保护变量不被其他文件访问三、static的用法1. 在函数内部使用static修饰局部变量2. 在全局变量前使用static修饰3. 在函数前使用static修饰函数四、static与全局变量、局部变量以及extern的区别与通联五、static在不同编程语言中的应用情况六、总结一、static的基本概念在C语言中,static是一个重要的关键字,它可以用来修饰变量和函数,具有一定的特殊作用。

二、static的作用1. 控制变量的作用域当static修饰局部变量时,该变量的作用域仅限于声明它的函数内部,超出该函数范围后,该变量就无法被访问。

这种特性在一定程度上增强了函数的安全性和封装性,避免了变量被误用或意外修改的风险。

2. 保持变量的持久性一般情况下,局部变量的生命周期仅限于其所在的函数执行期间,函数执行完毕后,这些局部变量所占用的内存空间就会被回收。

但是,如果将局部变量使用static修饰后,它的生命周期将会被延长至整个程序的执行期间,即使函数执行完毕,该变量所占用的内存空间也不会被回收。

这种特性有利于在多次调用同一个函数时,保持上一次调用的状态信息。

3. 保护变量不被其他文件访问当static修饰全局变量时,该全局变量的作用范围会被限制在声明它的文件内部,其他文件无法直接访问该全局变量。

这为数据的封装和保护提供了可能。

三、static的用法1. 在函数内部使用static修饰局部变量```void function() {static int a = 0;// other statements}```2. 在全局变量前使用static修饰```static int b = 0;// other statements```3. 在函数前使用static修饰函数```static void function() {// function statements}```四、static与全局变量和局部变量以及extern的区别与通联1. static全局变量和普通全局变量的区别在于作用域不同。

c语言中static的用法

c语言中static的用法

c语言中static的用法c语言中static的用法的用法如下:static在c里面可以用来修饰变量,也可以用来修饰函数。

先看用来修饰变量的时候。

变量在c里面可分为存在全局数据区、栈和堆里。

其实我们平时所说的堆栈是栈而不是堆,不要弄混。

复制代码代码如下:int a ;int main(){int b ;int c* = (int *)malloc(sizeof(int));}a是全局变量,b是栈变量,c是堆变量。

static对全局变量的修饰,可以认为是限制了只能是本文件引用此变量。

有的程序是由好多.c文件构成。

彼此可以互相引用变量,但加入static修饰之后,只能被本文件中函数引用此变量。

static对栈变量的修饰,可以认为栈变量的生命周期延长到程序执行结束时。

一般来说,栈变量的生命周期由OS管理,在退栈的过程中,栈变量的生命也就结束了。

但加入static修饰之后,变量已经不再存储在栈中,而是和全局变量一起存储。

同时,离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。

static对函数的修饰与对全局变量的修饰相似,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。

文件a.c复制代码代码如下:static int i; //只在a文件中用int j; //在工程里用static void init() //只在a文件中用(1)全局变量一般用外部存储方式存储,用保留字extern加以定义。

此时,变量的作用域是构成整个程序的所有程序文件,也就是定义的外部变量可供其它程序文件使用。

(2)如果希望全局变量仅限于本程序文件使用,而其它程序文件中不能引用,这时必须将其存储方式定义为静态存储方式,用保留字static 加以定义。

此时称为静态外部变量。

例如,在上例文件filel.c中,如果作这样的定义:static int a:则变量a的作用域被缩小至本程序文件filel.c,文件file2.c中不能引用。

c语言中static的用法

c语言中static的用法

c语言中static的用法c语言中static的用法的用法你知道吗?下面小编就跟你们详细介绍下c语言中static的用法的用法,希望对你们有用。

c语言中static的用法的用法如下:static在c里面可以用来修饰变量,也可以用来修饰函数。

先看用来修饰变量的时候。

变量在c里面可分为存在全局数据区、栈和堆里。

其实我们平时所说的堆栈是栈而不是堆,不要弄混。

复制代码代码如下:int a ;int main(){int b ;int c* = (int *)malloc(sizeof(int));}a是全局变量,b是栈变量,c是堆变量。

static对全局变量的修饰,可以认为是限制了只能是本文件引用此变量。

有的程序是由好多.c文件构成。

彼此可以互相引用变量,但加入static修饰之后,只能被本文件中函数引用此变量。

static对栈变量的修饰,可以认为栈变量的生命周期延长到程序执行结束时。

一般来说,栈变量的生命周期由OS管理,在退栈的过程中,栈变量的生命也就结束了。

但加入static修饰之后,变量已经不再存储在栈中,而是和全局变量一起存储。

同时,离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。

static对函数的修饰与对全局变量的修饰相似,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。

文件a.c复制代码代码如下:static int i; //只在a文件中用int j; //在工程里用static void init() //只在a文件中用{}void callme() //在工程中用{static int sum;}上面的全局i变量和init()函数只能用在a.c文件中,全局变量sum 的作用域只在callme里。

变量j和函数callme()的全局限扩充到整个工程文件。

所以可以在下面的b.c中用extern关键字调用。

extern告诉编译器这个变量或者函数在其他文件里已经被定义了。

static在c中的作用

static在c中的作用

static在c中的作用static是C语言中的一个关键字,它用于声明静态变量、静态函数以及限定符。

它的作用主要体现在以下几个方面:1. 静态变量的作用范围仅限于声明它的函数内部,但其生命周期与程序的整个运行周期相同。

这意味着当函数执行完毕后,静态变量的值仍然保持不变,下次调用该函数时可以继续使用原来的值。

静态变量的特性使得它在函数调用时可以起到记忆的作用,比如可以记录函数调用的次数、保存上次调用的结果等。

2. 静态函数的作用范围也仅限于声明它的源文件内部,不能被其他源文件调用。

它的主要作用是将函数的作用域限定在当前源文件中,避免与其他源文件中的函数发生命名冲突。

静态函数在编译时会被编译器解析并生成与之对应的符号表,但在链接时不会被放入符号表中。

3. 静态限定符用于限制外部变量或函数的作用范围,使其仅在声明它的源文件内部可见,而在其他源文件中不可见。

通过使用静态限定符,可以避免全局变量或全局函数被其他源文件随意修改或调用,提高程序的安全性和可维护性。

静态变量的使用示例:```c#include <stdio.h>void func() {static int count = 0;count++;printf("函数调用次数:%d\n", count);}int main() {for (int i = 0; i < 5; i++) {func();}return 0;}```在上述代码中,我们声明了一个静态变量count,并在每次调用func函数时对count进行自增操作,然后将其打印出来。

运行结果如下:```函数调用次数:1函数调用次数:2函数调用次数:3函数调用次数:4函数调用次数:5```可以看到,每次调用func函数时,count的值都会保持下来,这是因为静态变量的生命周期与程序的整个运行周期相同。

如果不使用static关键字声明count变量,那么每次调用func函数时都会重新声明和初始化count变量,无法实现计数的功能。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。

前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。

一、面向过程设计中的static1、静态全局变量在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。

我们先举一个静态全局变量的例子,如下://Example 1#include <iostream.h>void fn();static int n; //定义静态全局变量void main(){ n=20;cout<<n<<endl;fn();}void fn(){ n++;cout<<n<<endl;}静态全局变量有以下特点:该变量在全局数据区分配内存;未经初始化的静态全局变量会被程序自动初始化为0(自动变量的值是随机的,除非它被显式初始化);静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的;静态变量都在全局数据区分配内存,包括后面将要提到的静态局部变量。

对于一个完整的程序,在内存中的分布情况如下图:代码区全局数据区堆区栈区一般程序的由new产生的动态数据存放在堆区,函数内部的自动变量存放在栈区。

自动变量一般会随着函数的退出而释放空间,静态数据(即使是函数内部的静态局部变量)也存放在全局数据区。

全局数据区的数据并不会因为函数的退出而释放空间。

细心的读者可能会发现,Example 1中的代码中将static int n; //定义静态全局变量改为int n; //定义全局变量程序照样正常运行。

的确,定义全局变量就可以实现变量在文件中的共享,但定义静态全局变量还有以下好处:静态全局变量不能被其它文件所用;其它文件中可以定义相同名字的变量,不会发生冲突;您可以将上述示例代码改为如下://Example 2//File1#include <iostream.h>void fn();static int n; //定义静态全局变量void main(){ n=20;cout<<n<<endl;fn();}//File2#include <iostream.h>extern int n;void fn(){ n++;cout<<n<<endl;}编译并运行Example 2,您就会发现上述代码可以分别通过编译,但运行时出现错误。

试着将static int n; //定义静态全局变量改为int n; //定义全局变量再次编译运行程序,细心体会全局变量和静态全局变量的区别。

2、静态局部变量在局部变量前,加上关键字static,该变量就被定义成为一个静态局部变量。

我们先举一个静态局部变量的例子,如下://Example 3#include <iostream.h>void fn();void main(){ fn();fn();fn();}void fn(){ static n=10;cout<<n<<endl;n++;}通常,在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量分配栈内存。

但随着程序退出函数体,系统就会收回栈内存,局部变量也相应失效。

但有时候我们需要在两次调用之间对变量的值进行保存。

通常的想法是定义一个全局变量来实现。

但这样一来,变量已经不再属于函数本身了,不再仅受函数的控制,给程序的维护带来不便。

静态局部变量正好可以解决这个问题。

静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。

静态局部变量有以下特点:该变量在全局数据区分配内存;静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;它始终驻留在全局数据区,直到程序运行结束。

但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束;3、静态函数在函数的返回类型前加上static关键字,函数即被定义为静态函数。

静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。

静态函数的例子://Example 4#include <iostream.h>static void fn();//声明静态函数void main(){fn();}void fn()//定义静态函数{ int n=10;cout<<n<<endl;}定义静态函数的好处:静态函数不能被其它文件所用;其它文件中可以定义相同名字的函数,不会发生冲突;二、面向对象的static关键字(类中的static关键字)1、静态数据成员在类内数据成员的声明前加上关键字static,该数据成员就是类内的静态数据成员。

先举一个静态数据成员的例子。

//Example 5#include <iostream.h>class Myclass{public:Myclass(int a,int b,int c);void GetSum();private:int a,b,c;static int Sum;//声明静态数据成员};int Myclass::Sum=0;//定义并初始化静态数据成员Myclass::Myclass(int a,int b,int c){ this->a=a;this->b=b;this->c=c;Sum+=a+b+c;}void Myclass::GetSum(){ cout<<"Sum="<<Sum<<endl;}void main(){ Myclass M(1,2,3);M.GetSum();Myclass N(4,5,6);N.GetSum();M.GetSum();}可以看出,静态数据成员有以下特点:对于非静态数据成员,每个类对象都有自己的拷贝。

而静态数据成员被当作是类的成员。

无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷贝,由该类型的所有对象共享访问。

也就是说,静态数据成员是该类的所有对象所共有的。

对该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共用。

所以,静态数据成员的值对每个对象都是一样的,它的值可以更新;静态数据成员存储在全局数据区。

静态数据成员定义时要分配空间,所以不能在类声明中定义。

在Example 5中,语句int Myclass::Sum=0;是定义静态数据成员;静态数据成员和普通数据成员一样遵从public,protected,private 访问规则;因为静态数据成员在全局数据区分配内存,属于本类的所有对象共享,所以,它不属于特定的类对象,在没有产生类对象时其作用域就可见,即在没有产生类的实例时,我们就可以操作它;静态数据成员初始化与一般数据成员初始化不同。

静态数据成员初始化的格式为:<数据类型><类名>::<静态数据成员名>=<值>类的静态数据成员有两种访问形式:<类对象名>.<静态数据成员名>或<类类型名>::<静态数据成员名>如果静态数据成员的访问权限允许的话(即public的成员),可在程序中,按上述格式来引用静态数据成员;静态数据成员主要用在各个对象都有相同的某项属性的时候。

比如对于一个存款类,每个实例的利息都是相同的。

所以,应该把利息设为存款类的静态数据成员。

这有两个好处,第一,不管定义多少个存款类对象,利息数据成员都共享分配在全局数据区的内存,所以节省存储空间。

第二,一旦利息需要改变时,只要改变一次,则所有存款类对象的利息全改变过来了;同全局变量相比,使用静态数据成员有两个优势:静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲突的可能性;可以实现信息隐藏。

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

静态成员函数与静态数据成员一样,都是类的内部实现,属于类定义的一部分。

普通的成员函数一般都隐含了一个this指针,this指针指向类的对象本身,因为普通成员函数总是具体的属于某个类的具体对象的。

通常情况下,this 是缺省的。

如函数fn()实际上是this->fn()。

但是与普通函数相比,静态成员函数由于不是与任何的对象相联系,因此它不具有this 指针。

从这个意义上讲,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数。

下面举个静态成员函数的例子。

//Example 6#include <iostream.h>class Myclass{public:Myclass(int a,int b,int c);static void GetSum();/声明静态成员函数private:int a,b,c;static int Sum;//声明静态数据成员};int Myclass::Sum=0;//定义并初始化静态数据成员Myclass::Myclass(int a,int b,int c){ this.a=a;this.b=b;this.c=c;Sum+=a+b+c; //非静态成员函数可以访问静态数据成员}void Myclass::GetSum() //静态成员函数的实现{// cout<<a<<endl; //错误代码,a是非静态数据成员cout<<"Sum="<<Sum<<endl;}void main(){ Myclass M(1,2,3);M.GetSum();Myclass N(4,5,6);N.GetSum();Myclass::GetSum();}关于静态成员函数,可以总结为以下几点:出现在类体外的函数定义不能指定关键字static;静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;非静态成员函数可以任意地访问静态成员函数和静态数据成员;静态成员函数不能访问非静态成员函数和非静态数据成员;由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长;调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,也可以直接使用如下格式:<类名>::<静态成员函数名>(<参数表>)调用类的静态成员函数。

相关文档
最新文档