static在C++中的详解

如题所述

static 是C++中很常用的修饰符,它被用来控制变量的存储方式和可见性,下面我将从 static 修饰符的产生原因、作用谈起,全面分析static 修饰符的实质。
static 的两大作用:
一、控制存储方式:
   static被引入以告知编译器,将变量存储在程序的静态存储区而非栈上空间。
   1、引出原因:函数内部定义的变量,在程序执行到它的定义处时,编译器为它在栈上分配空间,大家知道,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,如何实现?
最容易想到的方法是定义一个全局的变量,但定义为一个全局变量有许多缺点,最明显的缺点是破坏了此变量的访问范围(使得在此函数中定义的变量,不仅仅受此函数控制)。
   2、 解决方案:因此C++ 中引入了static,用它来修饰变量,它能够指示编译器将此变量在程序的静态存储区分配空间保存,这样即实现了目的,又使得此变量的存取范围不变。
二、控制可见性与连接类型 :
   static还有一个作用,它会把变量的可见范围限制在编译单元中,使它成为一个内部连接,这时,它的反义词为”extern”.
   Static作用分析总结:static总是使得变量或对象的存储形式变成静态存储,连接方式变成内部连接,对于局部变量(已经是内部连接了),它仅改变其存储方式;对于全局变量(已经是静态存储了),它仅改变其连接类型。

类中的static成员:
一、出现原因及作用:
   1、需要在一个类的各个对象间交互,即需要一个数据对象为整个类而非某个对象服务。
   2、同时又力求不破坏类的封装性,即要求此成员隐藏在类的内部,对外不可见。
   类的static成员满足了上述的要求,因为它具有如下特征:有独立的存储区,属于整个类。
温馨提示:内容为网友见解,仅供参考
第1个回答  2014-02-23
static,是静态变量的声明符
要对其详解,先得说下变量,有全局和局部之分

static的引入是为了解决“变量的可持续使用”和“在一定范围内使用”的问题
对于,可持续使用,
{static int a = 3;<br/> ....<br/>}
对于声明定义部分,无论其被调用几次,
都只执行一次

对于,一定范围内使用
,若是定义在程序的头文件,或是函数之外,那么,这个变量的作用范围就是这个文件,若是定义在函数中,它的作用范围就只是在这个函数中。
不同文件中,可以有同名的static变量
第2个回答  2014-02-23
static的用法(基本常用的哈, 高深的我也不知道)
1. 用static申明静态局部变量, 这种变量只执行一次初始化, 以后你在使用就不会执行初始化代码了
2. 全局static函数和变量, 加了static申明的全局函数和变量会将该函数/变量的作用于限制在本文件内部。这样,虽然是全局的函数/变量,但是其他文件不可见不可使用,在c中可屏蔽一些名称冲突等。c++有了名称空间概念和类之后就用的比较少了吧。反正我很少这样用。
3. 申明类的静态成员函数/变量。
第3个回答  2014-02-23
1. static 变量

静态变量的类型说明符是static。 静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量。 例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。

2. 静态局部变量

静态局部变量属于静态存储方式,它具有以下特点:

(1)静态局部变量在函数内定义 它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。

(2)允许对构造类静态局部量赋初值 例如数组,若未赋以初值,则由系统自动赋以0值。

(3)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。 根据静态局部变量的特点, 可以看出它是一种生存期为整个源程序的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。

3.静态全局变量

全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。

4. static 函数….. === 内部函数和外部函数

当一个源程序由多个源文件组成时,C语言根据函数能否被其它源文件中的函数调用,将函数分为内部函数和外部函数。

1 内部函数(又称静态函数)

如果在一个源文件中定义的函数,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用,这种函数称为内部函数。

定义一个内部函数,只需在函数类型前再加一个“static”关键字即可,如下所示:

static 函数类型 函数名(函数参数表)

{……}

关键字“static”,译成中文就是“静态的”,所以内部函数又称静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件。

使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。

2 外部函数

外部函数的定义:在定义函数时,如果没有加关键字“static”,或冠以关键字“extern”,表示此函数是外部函数:

[extern] 函数类型 函数名(函数参数表)

{……}

调用外部函数时,需要对其进行说明:

[extern] 函数类型 函数名(参数类型表)[,函数名2(参数类型表2)……];

[案例]外部函数应用。

(1)文件mainf.c

main()

{ extern void input(…),process(…),output(…);

input(…); process(…); output(…);

}

(2)文件subf1.c

……

extern void input(……) /*定义外部函数*/

{……}

(3)文件subf2.c

……

extern void process(……) /*定义外部函数*/

{……}

(4)文件subf3.c

……

extern void output(……) /*定义外部函数*/

{……}

static在C++中的详解
2、 解决方案:因此C++ 中引入了static,用它来修饰变量,它能够指示编译器将此变量在程序的静态存储区分配空间保存,这样即实现了目的,又使得此变量的存取范围不变。二、控制可见性与连接类型 :static还有一个作用,它会把变量的可见范围限制在编译单元中,使它成为一个内部连接,这时,它的反义词为”...

static在C和C++里各代表什么含义
外部静态变量\/函数(C)在C中static的第二种含义:用来表示不能被其它文件访问的全局变量和函数。3.静态数据成员\/成员函数(C++)C++重用了这个关键字,它表示属于一个类而不是属于此类的任何特定的对象的变量和函数。静态类成员包括静态数据成员和静态函数成员 ...

C++里的静态成员函数(以及static其它几种用法)
---自 core c++static在c++中的第五种含义:用static修饰不访问非静态数据成员的类成员函数。这意味着一个静态成员函数只能访问它的参数、类的静态数据成员和全局变量。不能用const的原因:一个静态成员函数访问的值是其参数、静态数据成员和全局变量,而这些数据都不是对象状态的一部分。而对成员函数...

C++类的线程函数为什么要加static修饰
因为对于非静态成员函数而言,默认情况下,参数列表中都会有一个this指针,例如fun(自定义参数),实际上编译后就变成这样类型:fun(自定义参数,某个类 * this)。这样编译就会出错,多了一个参数,所以这个函数就不能作为线程函数了。加上static修饰之后,类的成员函数就不会加上默认this了,所以符合...

在C++ 中,关键字static有什么作用
static有三种用途:修饰全局变量时,用于限制该全局变量的使用范围。仅能在本文件内使用该变量。修饰局部变量时,用于修改该变量的存储控件类型。普通局部变量存储在栈区,当函数执行结束后,就会被清空。静态局部变量存储在静态区,当函数执行结束后,不会被清空。下次再次执行函数时,能保持上一回的值。修...

c++static关键字的作用
c++中static关键字的作用是隐藏,利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。C++是一种面向对象的计算机程序设计语言,由美国ATT贝尔实验室的本贾尼·斯特劳斯特卢普博士在20世纪80年代初期发明并实现,最初它被称作“CwithClasses”(包含类的C语言)。它是一种静态数据...

C++ static静态成员函数详解
C++中的static静态成员函数提供了一种独特的功能,与普通成员函数有显著的区别。静态成员函数的关键特性在于它不依赖于对象实例,无需通过对象调用,且只能访问静态成员,如静态成员变量和静态成员函数。与普通成员函数的this指针不同,静态成员函数在编译时并不需要额外的this参数,这使得它们可以在对象创建...

C++中static、inline、weak symbol和Unused warnning
在C++编程中,`static`、`inline`、`weak symbol` 和 `Unused warning` 是一些关键概念,理解它们的用法和行为有助于编写高效且无警告的代码。`static` 关键字在 C++ 中有多种用途,最常见的两个场景是用于单例对象和本地作用域的函数或对象。当使用 `static` 修饰函数时,它具有本地作用域特性,...

在c语言中或在c++中,static 是怎么用的,麻烦高人请详细说明一下,并且...
(1)这个static变量加载运行时会被存放在static数据区,并且会被初始化;(2)在一个大工程中假如有很多.c文件,假如这个变量被定义为static那么它的可见区域仅仅在当前文件,对于其他.c文件不可见 如果用static修饰函数 这个函数只在当前的.c文件中可见,在其他.c文件中不可见 如果static变量为函数体...

c语言中static关键字
C++面向过程的static和C的是一样的。 C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。一、面向过程设计中的static 1、静态全局变量 在全局变量前,加上关键字static,该变量就被定义成为一个静态...

相似回答
大家正在搜