zoukankan      html  css  js  c++  java
  • static、extern分析

    1.extern

    extern在变量声明中有这样一个作用:你要在demo2.cpp中引用demo1.cpp中的一个全局变量,就要在demo2.h中用extern来声明这个全局变量(或者在demo1.h中声明,demo2.cpp中引入demo1.h)。

    demo1.h代码:

    demo1.cpp代码:

    demo2.cpp代码:

    2.static

      static的最主要功能是隐藏,其次因为static变量存放在静态存储区,它具备持久性和默认值0。

      1.静态全局变量

        在声明它的整个文件是可见的,而在文件之外是不可见的。

        上述extern的例子中已经表明,demo1.cpp中 static 修饰的全局变量 g_sniii,即便是在 demo1.h 中加了extern声明,在demo2.cpp中仍然无法使用。

      2.静态局部变量

        在上述demo1.cpp中的printStr()中定义一个静态局部变量,和一个局部变量

        

        在demo2.cpp中如下调用:

        

        运行结果:

        

        这是因为:

        1.静态局部变量被编译器放在全局存储区,所以它虽然是局部的,但是在程序的整个生命周期中存在。

        2.静态局部变量如果没有被用户初始化,则会被编译器自动初始化赋值0,以后每次调用该静态局部变量的时候,都从全局存储区读取上次修改之后的值,而不会每次都初始化。

         所以上述例子,两次调用printStr()之后,静态局部变量siii值为2。

      3.static函数

        

        

        

        

       问:

         多个对象会共享一组成员函数,编译器不会为每个对象都存储一个成员函数,而是将类的成员函数存储在某个单独的空间。(注意:逻辑上成员函数是属于对象的,因为虽然函数体相同,但是其中访问的数据成员是不同的,故为了节约空间所以才采取了这种物理实现)这种存储策略就会带来一个问题,当对象调用成员函数时,若此成员函数访问了对象的数据成员,成员函数如何知道该数据成员属于哪个对象?

        答:    

    //编译器为每个成员函数隐性地添加一个类的指针类型的参数(如A * this),当对象在成员函数中调用成员函数时,编译器会将该对象的首地址传递给该成员函数,这样下面的调用
    A  a;
    a.fun()
    {
      cout<<value<<endl;
    }
    //实际上就成了
    a.fun()
    {
      cout<<this->value<<endl;
    }
    //那this指针又和静态成员函数有什么联系呢?
    //静态成员函数和静态数据成员的性质相似,它们都是独立于对象而属于类的。静态成员函数不属于对象,所以它没有this指针,没有了this指针那么静态成员函数也就无法访问类的非静态数据成员。
    

    下面是中兴通讯2012校招笔试题的一道问答题:

    1. static全局变量与普通的全局变量有什么区别 ?

      全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。

      全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。

      这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。 

      static全局变量只初使化一次,防止在其他文件单元中被引用  

    2.  static局部变量和普通局部变量有什么区别 ?

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

      static局部变量只被初始化一次,下一次依据上一次结果值  

    3.  static函数与普通函数有什么区别?

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

      static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝  

  • 相关阅读:
    关于加密程序
    C++11的新特性lambda的小试牛刀RAII
    自动生成makefile的脚本
    关于pcre正则表达式库libpcre
    利用PHP执行SQL文件,将SQL文件导入到数据库
    Linux 系统是否适合于您?
    一个少年电脑病毒作者的独白
    PHP编程效率的20个要点
    JVM源码分析之javaagent原理完全解读
    如何更好的利用Node.js的性能极限
  • 原文地址:https://www.cnblogs.com/SZxiaochun/p/6378219.html
Copyright © 2011-2022 走看看