• C和C++编程中static关键字的含义-修饰函数和变量


    static用来修饰一个函数的时候,表示的意思如下:

    1、表示该方法只在本c文件中有效。在其他c文件中无法访问这个方法。
    2、static的方法的定义一般不放在.h文件中,因为这个方法只在一个c文件中有效。一般直接将该方法定义在c文件的开头部分就可以了。
    3、一般申明这种方法用来封装一些逻辑,和面向对象的private有点类似。比如,我们申明一个方法为static,然后申明一堆其他的方法 (根据用途的不同),这些方法会用不同的参数调用该static方法,而这些方法不是static的,所以,这些方法是可以被其他文件调用的,而这个 static方法封装了所有的逻辑,而且只在本c文件中有效,有效避免了其他文件直接方法该方法。有点面向对象的意思哦。

    static关键字用来修饰一个变量的时候:

    1、如果该变量是全局变量,即不属于任何function的一个变量,那么,表示该变量只能在当前的源文件中使用,其他源文件不能使用extern关键字来引用这个关键字。所以,其他源文件也可以定义同名的变量,不影响。
    2、如果在一个function中定义一个static变量,表示该变量的生命周期和本c文件的声明周期一样长,再次进入该function的时候,该static变量的值还保持为上次修改后的结果,如:

    Code: Select all
    int count() {
        static int result = 0;
        result++;
        return result;
    }


    每次进入这个count方法的时候,result的值不会被重复初始化为0,因为这是static变量,只会被初始化一次。下次进入这个count方法,result的值将会被一次次的累加。


    顺便提一下C++中的static:

    1. 如果static修饰一个class member variable,表示该变量和class type相关,多个该class的object/instance都share这一个变量。

    2. 如果static修饰一个class function member,表示该函数没有this指针。其实也就是该函数和class type相关,不和instance相关。由于function没有this指针,就没法使用class instance中的变量,只能访问一些static的变量。

    如果static变量或函数不出现在class中,则C++ Primer中明确提到,对于这种和传统C相同的static的变量或函数,应使用Unnamed Namespace来代替使用static。C++中使用Unnamed Namespace来代替传统的static,每个源文件都有自己独立的Unnamed Namespace,定义在unnamed namespace中的变量或函数表示只在该源文件中有效。其他源文件不能引用和访问这些变量或函数。其他源文件也可以定义名字相同的变量或函数。

    传统的C中继承过来的static全局变量或函数将来有可能不支持,所以,请使用unnamed space来代替。

    有关Unnamed Namespace的具体内容请参考C++ Primer 4th Edition Section 17.3
     

  • 相关阅读:
    codevs 2602 最短路径问题x
    codevs 1077 多源最短路x
    2010TianjinRegional 部分题解
    [CF706D]Vasiliy's Multiset(异或字典树)
    [CF710E]Generate a String(DP)
    [CF710C]Magic Odd Square(构造)
    [CF151B]Phone Numbers(暴力,模拟)
    [POJ2104]K-th Number(主席树,静态区间k小)
    [CF707D]Persistent Bookcase(离线,DFS)
    [CF707C]Pythagorean Triples(数学)
  • 原文地址:https://www.cnblogs.com/super119/p/1996101.html
Copyright © 2020-2023  润新知