精华内容
下载资源
问答
  • 静态全局函数
    2022-02-28 13:51:59

    局部变量:

    局部变量也叫auto自动变量(auto可写可不写),一般情况下代码块{ }内部定义的变量都是自动变量,有如下特点:

    • 在一个函数内定义,只在函数范围内有效;
    • 在复合语句中定义,只在复合语句中有效;
    • 随着函数调用的结束或复合语句的结束局部变量的的声明周期也结束;
    • 如果没有赋值,内容随机。

    静态局部变量:

    在变量前面加上static关键字就是静态局部变量,有以下特点:

    • static局部变量的作用域也是在定义的函数内部有效;
    •  static局部变量的生命周期和程序运行周期一样;
    • static局部变量的值只能初始化一次,但可以多次赋值;
    • static局部变量若未赋予初值,则有系统自动赋值,数值型变量自动赋初值0,字符型变量赋空字符;
    • 在一个函数内静态局部变量和局部变量的变量名不能相同。

    全局变量:

     全局变量声明:数据类型 变量名=初始值;

    特点:

    • 在函数外定义,可被本文件及其他文件中的函数所共用,若其他函数调用此变量,必须用extern声明;(extern全局变量声明:extern int a;声明一个变量,这个全局变量在别的文件中已经定义了,这里只是声明,不是定义)
    • 全局变量的生命周期和程序的运行周期一样;
    • 不同文件的全局变量不可重名

    静态全局变量:

    特点:

    • 在函数外定义,作用范围被限制在所定义的文件中;
    • 不同文件静态全局变量可以重名,作用域不冲突;
    •  static全局变量的声明周期和程序的运行周期相同,同时static全局变量的值只能初始化一次。
    变量类型:生命周期:作用范围:存储空间:
    局部变量:从局部变量创建到函数结束函数内部栈区
    静态局部变量:从程序创建到程序销毁函数内部数据区
    全局变量:从程序创建到程序销毁项目中所有文件数据区
    静态全局变量:从程序创建到程序销毁定义所在的文件数据区

     全局函数和静态函数

    在C/C++中函数默认是全局的,在函数返回值类型前面加上static关键字可以将函数声明为静态,函数定义为static就意味着这个函数只能在定义这个函数的文件内使用,在其它函数内不能调用,即使在其它文件中声明这个函数也没用。

    注意: 

    没有局部函数,函数不能嵌套;

    函数类型:生命周期:作用范围:存储空间:
    全局函数:从程序创建到程序销毁项目中所有文件代码区
    静态函数:从程序创建到程序销毁定义所在的文件代码区

     注意:

    允许不同的函数中使用相同的函数名,他们代表不同的对象,分配不同的单元,互不干扰;

    在同一源文件中,允许全局变量和局部变量重名,全局变量和全局静态变量不能重名,局部变量和局部静态变量不能重名,全局函数和静态函数不能重名;

    在局部变量的作用域内,全局变量不起作用;

    所有的函数默认都是全局的,意味着不同文件中的所有的函数都不能重名,但如果是static函数,那么作用于是文件级的,在不同的文件中static函数可以重名

    更多相关内容
  • 关于静态函数(类成员及非类成员)和静态变量的声明与使用

    一、静态全局函数:普通的全局函数+static限制

    static void func(){}
    

    静态全局函数加入static限制后,只能在文件所在的编译单位内使用,不能在其它编译单位内使用。

    二、静态成员函数:类中的成员函数 + static限制

    class A
    {
    public:
    	static void func();
    	static int a;
    }
    
    // 静态成员函数及变量:类内声明,类外实现
    void A::func(){}
    int A::a = 100;
    

    1、在类中,用static声明的成员变量为静态成员变量,它为该类的公用变量,在第一次使用时被初始化,对于该类的所有对象来说,static成员变量只有一份。如上例中的成员变量 a
    2、在类中的静态成员函数,只能访问类中的静态成员变量
    3、可以通过对象引用或类名(不需要实例化)访问静态成员。

    // 通过类名访问静态成员函数和静态成员变量
    A::func();	
    A::a;
    

    以下是完整代码:

    
    #include <iostream>
    using namespace std;
    
    class Aaa
    {
    public:
        static void func();
        static int a;
    };
    
    // 静态成员函数:类内声明,类外实现
    void Aaa::func()
    {
        cout << "It's func()" << endl;
    }
    
    // 静态成员变量:类内声明,类外实现
    int Aaa::a = 100;
    
    // 全局静态函数:其他文件中不能引用
    static void GlobalFunc()
    {
        cout << "It's global static func!" << endl;
    }
    
    int main()
    {
        Aaa::func(); // 使用类名访问静态成员函数
        cout << "a = " << Aaa::a << endl; // 使用类名访问静态成员变量
        GlobalFunc();
        return 0;
    }
    

    谢谢阅读

    展开全文
  • 1)全局静态函数只在本编译单元有效。  2)类静态函数,对比普通成员函数,没有this指针,不能访问非static成员。  3)要说二者相同点,都是c++名字控制的手段:全局静态函数被局限在一个编译单元,通俗的将是...
  • 例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。 2. 静态局部变量 静态局部变量属于静态存储方式,它具有以下特点: (1)静态局部变量...
    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(……)
    {……}



    1、static 声明的变量在C语言中有两方面的特征:

    1)、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。

    2)、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。


    2、问题:Static的理解
      关于static变量,请选择下面所有说法正确的内容:

      A、若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;

      B、若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;

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

      D、静态全局变量过大,可那会导致堆栈溢出。

      答案与分析:

      对于A,B:根据本篇概述部分的说明b),我们知道,A,B都是正确的。

      对于C:根据本篇概述部分的说明a),我们知道,C是正确的(所谓的函数重入问题,下面会详细阐述)。

      对于D:静态变量放在程序的全局数据区,而不是在堆栈中分配,所以不可能导致堆栈溢出,D是错误的。

      因此,答案是A、B、C。

    3、问题:不可重入函数

      曾经设计过如下一个函数,在代码检视的时候被提醒有bug,因为这个函数是不可重入的,为什么?

    unsigned int sum_int( unsigned int base )
    {
     unsigned int index;
     static unsigned int sum = 0; // 注意,是static类型的。
     for (index = 1; index <= base; index++)
     {
      sum += index;
     }
     return sum;
    }

      答案与分析:

      所谓的函数是可重入的(也可以说是可预测的),即:只要输入数据相同就应产生相同的输出。

      这个函数之所以是不可预测的,就是因为函数中使用了static变量,因为static变量的特征,这样的函数被称为:带“内部存储器”功能的的函数。因此如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量,这种函数中的static变量,使用原则是,能不用尽量不用。

      将上面的函数修改为可重入的函数很简单,只要将声明sum变量中的static关键字去掉,变量sum即变为一个auto 类型的变量,函数即变为一个可重入的函数。

      当然,有些时候,在函数中是必须要使用static变量的,比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。


    转载:http://blog.csdn.net/xd0718/article/details/7773777



    展开全文
  • 在CSDN上发帖讨论关于静态函数与全局静态函数的区别时,有网友指出没有全局静态函数之说,既然是全局函数又怎么能是静态的那?关于这个问题,我不想正面回答,static是C++关键字之一,它的作用就是:把有static修饰...
  • 在C++中我们可以说全局变量的声明在头文件以下面这种格式声明 ...那么静态全局变量呢,这个有意思了,它的作用域是在一个文件里的,因此别的文件其实也用不到它的声明, 因此它不需要声明,声明了 也是空声明,...
  • 静态成员变量和静态成员函数 class ClassA { int a; int b; static int c; //静态成员变量 ...静态成员变量本质是全局变量,静态成员函数本质是全局函数静态成员函数不能为虚函数。 静态成员函数没有thi
  • 1、全局变量、局部变量、静态全局变量、静态局部变量的区别 (1)从作用域看: 1)全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件...
  • C++深度解析 类中的函数重载 -- 全局函数,普通成员函数,静态成员函数(28)       函数重载的回顾 函数重载的本质为相互独立的不同函数 C++中通过函数名和函数参数确定函数调用 无法直接通过函数名得到...
  • CHook钩子编程通过内联汇编使类成员函数代替全局函数静态函数的知识点.pdf
  • 静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。该变量在全局数据区内分配内存;静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行...
  • C++Hook(钩子)编程,通过内联汇编,使类成员函数代替全局函数(静态函数).pdf
  • 详解C++之函数重载

    2020-12-17 04:35:31
    全局函数静态成员函数、普通成员函数可以发生重载吗? 本质就是函数名和函数参数不同,并且发生在同一个作用域 静态函数和普通成员函数是可以的 全局函数作用域在全局作用域,所以不可以 问题1:当父类的成员函数...
  • C++Hook(钩子)编程,通过内联汇编,使类成员函数代替全局函数(静态函数)[收集].pdf
  • 在定义函数时,如果在函数首部的最左端冠以关键字extern,则表示此函数是外部函数,可供其他文件调用。 如果在定义函数时省略extern,则默认为外部函数。 但是,在调用外部函数时,声明中不可省略extern。 /* 另一...
  • 静态数据成员和静态成员函数

    万次阅读 多人点赞 2018-08-26 19:18:35
    c++中的static静态数据成员和静态成员函数应该是让大家比较头疼的东西,好像也是找工作公司面试中常常问到的东西。我自己也深有体会,在学习c++的过程中,总感觉static很烦人,但是又是一个必须懂的东西,所以今天就...
  • 定义:在全局变量前,加上关键字 static 该变量就被定义成为了一个静态全局变量。 特点: ① 、该变量在全局数据区分配内存。 ② 、初始化:如果不显式初始化,那么将被隐式初始化为0。   静态局部变量 定义:在...
  •  例如外部变量虽属于静态 存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。 2. 静态局部变量  静态局部变量属于静态存储方式,它具有以下特点: (1)静态...
  • 全局变量的使用方法 参考链接:... 强烈建议使用xxx.h和xxx.cpp的形式创建全局变量和全局函数。.h和.cpp分别来声明和定义全局变量。此处建议,.h文件最好只写变量和函数的声...
  • 用MFC制作的工程由很多文件构成,它不能象一般C++程序那样随意在类外定义全局变量,在这里要想定义能被工程内多个文件共享的全局变量和函数必须用一些特殊方法才行。实际上有多种方法可以实现,这里只介绍两种方法。
  • qt -- Q_GLOBAL_STATIC创建全局静态对象

    千次阅读 2022-03-16 17:23:08
    创建一个全局静态对象,类型为...用法如下,在全局上下文中(即,在任何函数体之外): Q_GLOBAL_STATIC(MyType, staticType)。这个宏的目的是替换不是POD的全局静态对象(Plain Old Data,或者用c++ 11术语来说,不是...
  • C++的静态成员变量和静态成员函数

    万次阅读 2019-05-22 15:35:41
    与普通的成员变量和成员函数相比,静态成员函数静态成员变量是属于类的,而不是属于对象的,也就是说,在类实例化为对象之前,静态成员变量和静态成员函数就已经分配了内存空间了,而普通成员函数和成员变量只有在...
  • 静态函数可以分为全局静态函数和类的静态成员函数静态变量:用static声明的变量是静态变量。静态变量可以分为全局静态变量和类的静态成员变量。在类中,用static声明的变量为类的静态成员变量,它为该类的公用变量...
  •  局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量...
  • 类中的静态成员函数属于全局函数属于所有该类对象共有,不是属于某单独的一个类的对象,类中普通成员函数是单独的对象所拥有;既然说静态成员函数属于全局函数,那么为什么不向其他全局函数一样写在类的外部呢?原因...
  • 静态局部变量的特点: 1.不会随着函数的调用和退出而发生变化,不过,尽管该变量还...虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。复制代码 代码如下:functio
  • C++静态成员函数访问非静态成员的四种方法

    千次阅读 多人点赞 2021-07-01 17:00:48
    大家都知道C++中类的成员函数默认都提供了this指针,在非静态成员函数中当你调用函数的时候,编译器都会“自动”帮你把这个this指针加到函数形参里去。当然在C++灵活性下面,类还具备了静态成员和静态函数,即 class...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 377,319
精华内容 150,927
关键字:

静态全局函数

友情链接: 2.rar