代码之家  ›  专栏  ›  技术社区  ›  Hristo

当C++中声明“全局”变量时,“静态”究竟是什么意思?

  •  5
  • Hristo  · 技术社区  · 15 年前

    previous question of mine .

    究竟什么是“静态”,如何使用,以及在处理C++时使用“静态”的目的是什么?

    谢谢。

    6 回复  |  直到 8 年前
        1
  •  10
  •   David Rodríguez - dribeas    15 年前

    static 在C++中有不同的含义,这取决于上下文。

    当声明自由函数或全局变量时,意味着该函数在这个转换单元之外不可用:

    // test.cpp
    static int a = 1;
    static void foo() {}
    

    如果编译该翻译单元的结果与包含符号的不同翻译单元相链接 a foo 它不会打破一个定义的规则,就像在这个特定的翻译单元中一样 私有的 符号。此用途已被未命名的命名空间淘汰。

    // test2.cpp
    namespace {
       static int a = 1;
       static void foo() {}
    }
    

    int foo() {
       static int counter = 0;
       return ++counter;
    }
    int main() {
      for ( int i = 0; i < 10; ++i ) { 
         std::cout << foo() << std::endl;
      }
    }
    

    在前面的代码中, counter 是第一次调用的,但变量将比函数长,并在不同的函数调用中保留值。前面的代码将打印“1 2 3 4。。。10". 如果变量未声明 静止的 那么输出将是“1。。。1".

    静止的

    struct test {
       int x;
       static int y;
    };
    int test::y;       // need to define it in one translation unit
    int main() {
       // test::x = 5; // !error cannot access a non-static member variable
                       // without an instance
       test::y = 5;    // ok
       test t, other;
       t.x = 10;       // ok
       t.y = 15;       // ok, the standard allows calling a static member through
                       // an instance, but this is the same as test::y
    }
    

    在这种情况下,成员 x 对于类的每个实例。在示例程序中 t.x other.x y test::y 在节目里。即使标准允许打电话 t.y other.y a.b a->b 必须使用语法。

    静止的 类似于在Java中使用相同的关键字,而其他两个关键字在该语言中不存在。在C++中没有java中的关键字的一种用法,即静态类初始化器的使用(在类级别上的代码块) static { ... } ). 在Java中,当类被加载时只执行一次代码块。C++中静态成员变量的初始化必须在变量定义的初始化器中完成。

        2
  •  13
  •   anon anon    15 年前

    static int x = 0;    
    

    namespace {
        int x = 0;    
    }
    
        3
  •  6
  •   torak    15 年前

    这些东西似乎覆盖得相当好 here .

    但换言之,C中有两种用法

    1. 防止在定义全局变量的文件范围之外使用全局变量。
    2. int getNextId() 静态int id=0; 返回id++; }

    C++继承了这两种,并增加了它自己的两种用法。

    1. 静态成员变量:“共享”的变量可以访问类的所有实例,也可以不引用类的实例进行访问。Shared看起来是个错误的词,但本质上我认为结果是任何对静态成员变量的引用都引用了相同的内存位置。
    2. 静态方法:不需要引用定义它的类的特定实例就可以调用的方法。
        4
  •  2
  •   Puppy    15 年前

    静态基本上意味着变量与程序的生存期相关联,而不是与任何给定的函数或类实例相关联。你应该什么时候用?不要。目的是什么?主要是调试数据。

    通常,在C++中,如果发现自己使用静态数据,那么就错了。有时是合适的,但非常罕见。

        5
  •  1
  •   doron    15 年前

    当在局部函数中的变量旁边使用static时,这意味着该变量不会超出范围,但会在函数调用到函数调用之间保留其值。该变量实际上是一个只能从给定函数访问的全局变量。

        6
  •  0
  •   josh    15 年前

    静态类成员是与类本身关联的数据和函数,而不是与类的对象关联的数据和函数。

    在下面的示例中,Fred类有一个静态数据成员x\和一个实例数据成员y\。无论创建了多少个Fred对象(不包括Fred对象),只有一个Fred::x的副本,但是每个Fred对象都有一个y。因此,x\被称为与类相关联,y\被称为与类的单个对象相关联。类似地,类Fred有一个静态成员函数f()和一个实例成员函数g()。

    class Fred {
        public:
            static void f() throw();                           <-- 1
            void g() throw();                                  <-- 2
        protected:
            static int x_;                                     <-- 3
            int y_;                                            <-- 4
    };
    

    (1) 与类关联的成员函数

    (2) 与类的单个对象关联的成员函数

    (4) 与类的单个对象关联的数据成员