`
蒙面考拉
  • 浏览: 156236 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

static变量与static函数(转)

 
阅读更多

一、 static 变量

static变量大致分为三种用法
1. 用于局部变量中,成为静态局部变量. 静态局部变量有两个用法,记忆功能和全局生存期.
2. 用于全局变量,主要作用是限制此全局变量被其他的文件调用.
3. 用于类中的成员.表示这个成员是属于这个类但是不属于类中任意特定对象

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

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

举例如下:
int fun() {
    static int a = 1;
    a++;
}
在第一次进入这个函数的时候,变量a被初始化为1!并接着自增1,以后每次进入该函数,a就不会被再次初始化了,仅进行自增1的操作;在static发明前,要达到同样的功能,则只能使用全局变量:
int a = 1;
int fun() {
    a++;
}

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

3.static的类成员变量

static关键字有两种意思,你看上下文来判断

a,表示变量是静态存储变量,表示变量存放在静态存储区.

b,表示该变量是内部连接(这种情况是指该变量不在任何{}之内,就象全局变量那样,这时候加上static),也就是说在其它的.cpp文件中,该变量是不可见的(你不能用).   

二、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变量和static函数的用法摘抄

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

    C语言静态变量和静态函数

    C_语言静态变量和静态函数,可以让您对C语言静态变量和静态函数有更清晰的认识

    Java中static变量作用和用法步骤

    static表示“全局”或者“静态”的意思,用来修饰成员...  用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象市,不生成static变量的副本,而是类的所有实例共享同一个static变量。

    吕鑫:【C++语法与数据结构第06天】【第3堂课】静态成员变量与静态成员函数(面试题)

    1、讲解static静态局部变量的原理与特点; 2、讲解static静态全局变量的原理与特点; 3、讲解static静态成员变量的原理与特点; 4、讲解static静态成员函数的原理与特点;

    static 用法

    无法使用file1.cpp文件中static函数 三、静态数据成员/成员函数(C++特有) C++重用了这个关键字,并赋予它与前面不同的第三种含义:表示属于一个类而不是属于此类的任何特定对象的变量和函数. 这是与普通成员...

    lazy-static.rs, 在 Rust 中,用于定义惰性计算的static 变量的小宏.zip

    lazy-static.rs, 在 Rust 中,用于定义惰性计算的static 变量的小宏 lazy-static.rs在 Rust 中声明延迟求值的静态的宏。使用这里宏,可以以使 static s 在运行时要求执行代码,以便初始化。 这包括需要堆分配,如...

    静态成员变量和静态成员函数

    详细地解说了static关键词,以及静态成员变量和静态成员函数

    static静态变量使用@Value注入方式.md

    MarkDown文档,大家应该都知道,@Value注解可以给类中的非静态变量注入值,但是给静态变量注入值则会有警告,结果是失败的,本文档说明了如何使用@Value注解给类的静态变量赋值

    static成员变量不属于对象的一部分,而是类的一部分,所以程序可以在还没有诞生任何对象的时候就处理此种成员变量

    不要把static成员变量的初始化操作安排在类的构造函数中,因为构造函数可能一再被调用,而static成员变量只实例化一次。也不要把初始化操作安排在头文件中,因为它可能会被载入许多地方,因此也就可能被执行多次。...

    static全局变量与普通的全局变量的区别详细解析

    (3)static函数与普通函数作用域有什么不同?(4)static函数与普通函数有什么区别? (1)static全局变量与普通的全局变量有什么区别?答:全局变量的说明之前再加以static 就构成了静态的全局变量。全局变量本身就是...

    深入理解C语言 static、extern与指针函数

    static函数与普通函数有什么区别? 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者...

    C++中的static修饰的变量和函数

    C++里的静态成员函数(不能用const的原因+static在c++中的第五种含义)  ----自 core c++  static在c++中的第五种含义:用static修饰不访问非静态数据成员的类成员函数。这意味着一个静态成员函数只能访问...

    C语言、变量和函数的作用域与生存期

    详细介绍了C语言中 函数和变量的作用域 和生存期 他们的各种使用情况、、 存储类型说明有四种。 auto 自动变量。 register 寄存器变量。 extern 外部变量。 static 静态变量

    php中static 静态变量和普通变量的区别

    static变量和普通变量的区别在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内...

    C#中static静态变量的用法实例

    使用 static 修饰符声明属于类型本身而不是属于特定对象的静态成员static修饰符可用于类、字段、方法、属性、运算符、事件和构造函数,但不能用于索引器、析构函数或类以外的类型   静态全局变量 定义:在全局变量...

    C++中静态成员函数与静态成员变量(static )

    C++中静态成员函数与静态成员变量(static ) 这篇介绍了静态成员函数与静态成员变量,是我的读书笔记,我希望它够简短但又比较全面,起到复习的作用。如果有一些C++知识记不清楚了,它可以帮你很快回忆起来。 复习...

    Asp.net中static变量和viewstate的使用方法(谨慎)

    如在页面中统计某个按钮被按下的次数,先在类中OnClick事件的处理过程前定义一static变量times,则每次调用该按钮的OnClick事件时,令times增1即可,非常方便: [C#]: 代码如下: … static int times=0; … private ...

    C++中的static关键字.doc

    C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。

    C/C++中static,const,inline三种关键字详细总结

    引出原因:函数内部定义的变量,在程序执行到它的定义处时,编译器为它在栈上分配空间,大家知道,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次...

    python类和函数中使用静态变量的方法

    主要介绍了python类和函数中使用静态变量的方法,实例分析了三种常用的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics