zoukankan      html  css  js  c++  java
  • static关键字

    static关键字的含义有哪些呢?现在总结如下:

    1.static修饰变量
    static可以修饰变量。当static修饰全局变量时,表示该变量的作用域只存在于本文件。其他文件就不能引用。比如:
    在a.c文件里定义了2个全局变量:
    static int x = 10;
    int y = 0;
    其中x前面有static关键字修饰,而y没有。那么在文件b.c里,如果想引用x,y,那么:
    extern int y;//正确
    extern int x;//错误
    也就是说,x是不能再b.c文件里访问的,但y是可以的。这样做,其实是为了防止模块与模块之间因为全局变量而造成的命名冲突

    当static修饰函数内的局部变量时,表示该变量存储在静态存储区,而不是存储在栈上。因此该变量具有记忆功能。函数每次执行后,它的值都不会丢失。 

    问题:下面的函数实现在一个数上加一个数,有什么错误? 如何改正?
    int add_n ( int n )
    {
        static int i = 100;
        i += n;
        return i;
    }
    分析:由于i声明为static的类型,它存储在静态存储区,生命期为整个程序执行期间。因此,它的值在每次函数调用之后,都不会丢失。该函数原意是想对n加上100。但是实际执行的是,对n加上的并不是100而是函数上次执行后i的值。 因此,应该把代码做如下改正:
    int add_n ( int n )
    {
        int i = 100;
        i += n;
        return i;
    }
    实际上,C库中的strtok()函数就使用了static变量来计算。

    现在来看一道Intel的面试题:
    问题:A.c 和B.c两个c文件中使用了两个相同名字的static变量,编译的时候会不会有问题?这两个static变量会保存到哪里(栈还是堆或者其他的)?

    答案:用关键字static的修饰的全局变量,表明这个变量仅在本文件(模块)中有意义,不会影响其他模块。这两个static变量保存在静态存储区。 

    关于更多static修饰变量的介绍,您还可以参考:《变量类型,作用域,存储空间,生命周期 》

    2.static修饰函数
    static关键字还可以修饰函数。在C语言里,static修饰函数,与static修饰全局变量作用是一样的,表示该函数仅在本文件中使用,其他文件中的函数不能调用此函数。其他文件中不能引用该函数,以避免名字冲突。 

    3.static在C++中
    在C++里,static修饰函数和变量,表示该函数或变量属于该C++类的静态成员,为所有对象共同所有。在类中,静态成员可以实现多个对象之间的数据共享,并且使用静态数据成员还不会破坏隐藏的原则,即保证了安全性。因此,静态成员是类的所有对象中共享的成员,而不是某个对象的成员。 使用静态数据成员可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。

    静态数据成员的值对每个对象都是一样,但它的值是可以更新的。只要对静态数据成员的值更新一次,保证所有对象存取更新后的相同的值,这样可以提高时间效率。 

    静态成员函数不接受隐含的this自变量。所以,它就无法访问自己类的非静态成员。

  • 相关阅读:
    使用Haskell写web
    src/lxml/etree.so: undefined symbol: xmlSchematronSetValidStructuredErrors 解决方案
    CentOS允许某一端口接受外部链接
    windows下的NTP服务
    Huffman树,Huffman编码的实现(C#)
    OpenGL的函数(GLU, GLUT)
    OpenGL的函数(GL)
    GLUT函数说明
    FreeImage使用基础,图像旋转,图像滤波
    Hello PureMVC!!!
  • 原文地址:https://www.cnblogs.com/fengxing999/p/11096950.html
Copyright © 2011-2022 走看看