这是一个范围的扩展 我之前的问题.

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

谢谢。

有帮助吗?

解决方案

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

当声明一个自由功能或全局变量它意味着函数应不该单个翻译单元的可用外:

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

如果在编译翻译单元的结果与含符号afoo它不会打破一个定义规则,如在该特定的翻译单元afoo被一个不同的翻译单元连接的私有符号。这种使用已经由未命名空间过时。

// 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被初始化一次时foo被称为首次,但变量将活得比的功能和保持在不同的函数调用的值。上面的代码将打印 “1 2 3 4 ... 10”。如果变量未声明static那么输出将是“1 1 1 ... 1”。

在一个类的范围内,static装置,该构件是类的一个成员,而不是一个特定实例的。这种使用是等同于您的其他问题的用途:该特定部件的使用并不受限于任何特定的对象

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是一个非静态成员属性,并且因此存在用于类的每个实例不同x。在示例程序t.xother.x指不同的整数。在另一方面ystatic因此存在在程序test::y的单个实例。即使标准允许调用t.yother.y两种用法指的是同一个变量。这同样与成员方法。如果它们是静态的它们的类级的方法,可以在不实例直接调用,而如果它们是非静态它们应用于一个具体的实例,并且必须使用a.ba->b语法。

此使用static的是类似于使用在Java中相同的关键字的,而其他两个是不存在于该语言。有一个用Java中的关键字的是不存在于C ++,并且是使用静态类初始化的(包围static { ... }中的类级别代码的块)。在Java中,当类被加载且仅一次的代码块将被执行。在C ++中的静态成员变量的初始化必须在变量定义的初始化来完成。

其他提示

这意味着变量是本地的一个翻译单元(简单地说,向一个源文件),并且不能从外面访问。这个使用静态的,其实在目前的C ++标准弃用 - 而不是你应该使用匿名的命名空间:

static int x = 0;    

应该是:

namespace {
    int x = 0;    
}

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

但换句话来说,C 中有 2 个用途

  1. 防止在定义全局变量的文件范围之外使用全局变量。
  2. 允许函数内的局部变量在函数的调用中持续存在,如下所示

    int getNextId(){static int ID = 0;返回id++;}

C++ 继承了这两者,并添加了自己的两个用途。

  1. 静态成员变量:在类的所有实例中“共享”的变量,并且也可以在不引用类的实例的情况下进行访问。共享似乎是一个错误的词,但本质上我相信结果是对静态成员变量的任何引用都引用相同的内存位置。
  2. 静态方法:可以在不引用定义它的类的特定实例的情况下调用方法。

静态基本上意味着一个变量是联系在一起的程序的生命周期,而不是任何给定的函数或类实例的。当你应该使用它?别。什么目的?调试数据,大多

一般情况下,在C ++中,如果你发现自己使用的静态数据,你错了做到了。还有,当它的合适的时间,但他们是非常罕见的。

当静态是在C类中使用++,这意味着更多的或更少的,它并在Java中同样的事情。对于变量这意味着该变量的一个一个实例存在于所有类和函数,这意味着该函数不隐含在所有访问该指针。

在C和当静态用于全局变量或函数C ++,那么就意味着该变量可以仅在当前C或C ++文件被引用。换句话说,编译器必须不生成用于可变或功能的任何重新定位的符号。

当静态使用旁边的本地函数的变量,这意味着该变量不出去的范围,而是将保留从函数调用的函数调用它的值。可变成为有效,只能从给定的功能访问的全局变量。

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

在以下示例中,Fred类有静态数据成员X_和实例数据成员Y_。只有一个弗雷德的副本:: X_不管如何创建许多弗雷德对象(包括无Fred对象),但每个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)成员函数

(3)数据成员与类

相关联的

(4)与类

的单个对象相关联的数据成员

<强>用法:

当你要保持一个类的实例数道创造了你使用静态变量。例如,在“汽车”类中的每个车载实例可以具有(在这种情况下_y)的唯一的序列号和该公司可能希望跟踪产生的(在这种情况下_x)的轿厢数量的

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top