static 变量 和 static 函数各有什么特点

static 变量 和 static 函数各有什么特点,第1张

1)、变量放程序全局存储区调用候保持原赋值点与堆栈变量堆变量区别

2)、变量用static告知编译器自仅仅变量作用范围内见点与全局变量区别

Tips:

A若全局变量仅单C文件访问则变量修改静态全局变量降低模块间耦合度;

B若全局变量仅由单函数访问则变量改该函数静态局部变量降低模块间耦合度;

C设计使用访问态全局变量、静态全局变量、静态局部变量函数需要考虑重入问题;

D我需要重入函数我定要避免函数使用static变量(函数称:带内部存储器功能函数)

E函数必须要使用static变量情况:比某函数返值指针类型则必须static局部变量址作返值若auto类型则返错指针

函数前加static使函数静态函数处static含义指存储式指函数作用域仅局限于本文件(所称内部函数)使用内部函数处:同编写同函数用担自定义函数否与其文件函数同名

扩展析:术语static着寻历史起初C引入关键字static表示退块仍存局部变量随staticC第二种含义:用表示能其文件访问全局变量函数避免引入新关键字所仍使用static关键字表示第二种含义C++重用关键字并赋予与前面同第三种含义:表示属于类属于类任何特定象变量函数(与Java关键字含义相同)

全局变量、静态全局变量、静态局部变量局部变量区别变量:全局变量、静态全局变量、静态局部变量局部变量

按存储区域全局变量、静态全局变量静态局部变量都存放内存静态存储区域局部变量存放内存栈区

按作用域全局变量整工程文件内都效;静态全局变量定义文件内效;静态局部变量定义函数内效程序仅配内存函数返该变量消失;局部变量定义函数内效函数返失效全局变量(外部变量)说明前再冠static

构静态全局变量全局变量本身静态存储式

静态全局变量静态存储式

两者存储式并同两者区别虽于非静态全局变量作用域整源程序

源程序由源文件组非静态全局变量各源文件都效

静态全局变量则限制其作用域

即定义该变量源文件内效

同源程序其源文件能使用由于静态全局变量作用域局限于源文件内能该源文件内函数公用

避免其源文件引起错误

析看

局部变量改变静态变量改变存储式即改变存期全局变量改变静态变量改变作用域

限制使用范围

static函数与普通函数作用域同仅本文件前源文件使用函数应该说明内部函数(static)内部函数应该前源文件说明定义于前源文件外使用函数应该文件说明要使用些函数源文件要包含文件

全局变量静态变量没手工初始化则由编译器初始化0局部变量值知

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

从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。

static函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件

static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;

static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;

static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

static意思是静态,可以修饰类、字段、属性、方法,但不能用于索引器、析构函数或类以外的类型。

标记为static的就不用创建实例对象调用了,可以通过类名直接点出来

1用于变量前,表示每次重新使用该变量所在方法、类或自定义类时,变量的值为程序这次运行最后一次为变量赋值时的值,这个方法称为 静态函数

2在方法(函数)前用static修饰,表示此方法为所在类或所在自定义类所有,而不是这个类的实例所有,这个方法称为 静态方法

情况一:非静态方法:

情况2:静态方法:

3用于class前,说明此类型无法新建实例,简单点说这个类型的方法全是静态方法,这个类里的非静态方法是不能使用的,这个类型称为 静态类

比如C#控制台 *** 作的Cancle类里面的成员就被标记为静态的,可以直接用Concle直接点出来使用。

如果没有标记为静态就要通过创建实例对象来调用,比如说动态字符串StringBuilder就要new一个实例来调用

注意:

1尽管类的实例包含该类所有实例字段的单独副本,但每个静态字段只有一个副本。

2不可以使用this来引用静态方法或属性访问器。

3如果对类应用static 关键字,则该类的所有成员都必须是静态的。

4类和静态类可以有静态构造函数。 静态构造函数在程序开始和类实例化之间的某个时刻调用。

静态类:

如果一个类,被声明为静态类,那么该类不可以被实例化,也不可以被继承,同时不可以包含非静态成员。

非静态类中,可以包含静态成员。

静态方法:

静态方法中,不可以访问非静态成员。

非静态方法中,可以调用静态和非静态成员。

静态成员的生命周期是:从程序开始到程序结束。

表示是静态函数

只能在本文件调用

不能在同工程中,其它C文件调用

使用static 可以避免不想被其它模块调用的函数调用

同时, 不同文件中的static函数可以重名

减少命名难度。

可以。

私有函数只有该类的成员变量或成员函数可以访问。在C语言中,也有“private函数”,它就是接下来要说的static函数,完成面向对象编程中private函数的功能。

当你的程序中有很多个源文件的时候,你肯定会让某个源文件只提供一些外界需要的接口,其他的函数可能是为了实现这些接口而编写,这些其他的函数你可能并不希望被外界(非本源文件)所看到,这时候就可以用static修饰这些“其他的函数”。

所以static函数的作用域是本源文件,把它想象为面向对象中的private函数就可以了。

在函数声明中加上static的好处是:

在多个文件链接时,static函数只是文件域内可见。

编辑本段C中的static函数

分类

static

函数内部函数和外部函数

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

内部函数

(又称静态函数)

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

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

static

函数类型

函数名(函数参数表)

{……}

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

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

外部函数

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

[extern]

函数类型

函数名(函数参数表)

{……}

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

[extern]

函数类型

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

[案例]外部函数应用。

(1)文件mainfc

main()

{

extern

void

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

input(…);

process(…);

output(…);

}

(2)文件subf1c

……

extern

void

input(……)

/定义外部函数/

{……}

(3)文件subf2c

……

extern

void

process(……)

/定义外部

函数/

{……}

(4)文件subf3c

……

extern

void

output(……)

/定义外部函数/

{……}

static在c语言中是私有、静态意思。

用于在函数中声明“静态变量”用,在每一次调用后,该变量并不在函数返回时立即释放,变量中保存的值,可以保留到下一次调用时继续有效。

私有就是隐藏。static函数只能声明后的本文中调用。static全局变量只能声明后的本文中调用。static局部变量只能声明后的本函数调用

静态就是一直存在,相对于每次调用动态分配而言。static函数未验证是否每次调用代码地址都是一致的。static全局变量生命周期到程序或进程结束。static局部变量生命周期到程序或进程结束。

static的使用和作用

静态全局变量。全局变量前加static,修饰全局变量为静态全局变量,改变全局变量的可见性。静态局部变量。局部变量前加static,修饰局部变量为静态局部变量,改变局部变量的销毁时期。静态函数。函数返回类型前加static,修饰函数为静态函数,改变函数的可见性。

类的静态成员。类成员前加static,修饰类的成员为类的静态成员,实现多个对象之间的数据共享,并且使用静态成员不会破坏封装性,也保证了安全性。类的静态函数,类函数前加static,修饰类的函数为静态函数,减少资源消耗,不需要实例化就可以使用。

我就说下常用情况吧

类中全部是静态方法,一般这个类的作用也就类似于思维上的一个命名空间了,一般工具类会使用这种方法,比如数学算法

举例:

CMath::translate()

CMath::move(x, y),

CMath::isEqual(x, y);

使用静态变量做单例,使用静态函数创建和释放单例,这样在逻辑上,这个单例属于一个类,而这个类是一个单例,在程序中仅存一份,也勉强算的上符合“谁创建谁释放”的原则了吧

举例: static CInstance CInstance::m_myInstance = NULL;

//创建单例 

CInstance  CInstance::getInstance(someVal)//声明处也是静态

{

if(m_myInstance == nullptr)

{

m_myInstance = new CInstance(someVal)           

}

return m_myInstance;

}

//释放单例

void   CInstance::destroyInstance(someVal)//声明静态

{

if(m_myInstance != nullptr)

{

delete m_myInstance;           

}

m_myInstance = nullptr;

}

3第三种情况呢,就是在一个类中,需要处理某块逻辑,于是把这块逻辑封成一个函数,但是发现这块逻辑与类中的成员变量毫无关系,而且这块逻辑可能又会在别的类中被调用,也类似于算法或者功能类的东西,就可以把这个函数提成静态函数,供其它类使用。

简单回忆了一下,大体就见过这么几种情形吧。

上面代码未进行编译,大体就是表达意思的伪代码,领会即可。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/11670006.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存