什么时候/为什么要在C ++中使用static?

时间:2018-10-09 13:05:04

标签: c++ static

我找到了Why/when should I declare a variable using static?,但是这些标记是关于Objective-c的。

当您使用static时,我无法确定c ++和Objective-c的用法细节是否有差异,那么何时/为什么应该在c ++中使用static?

1 个答案:

答案 0 :(得分:3)

static取决于上下文具有几个独立的含义。

void f() { ... }
static void g() { ... }

在这里,f具有“外部链接”,这意味着其名称在其他翻译单元中可见。也就是说,在另一个源文件中,您可以拥有void f();,然后可以调用函数f

另一方面,由于

g被标记为static,因此具有“内部链接”。您可以从同一源文件中的代码调用它,但不能从另一个源文件中调用它。

与对象相同:

int i = 3;        // external linkage
static int j = 4; // internal linkage

还有一个小麻烦:您可以在函数内部定义一个静态对象。

void f() {
    static int i = 3;
    std::cout << i << '\n';
    ++i;
}

在这里,i没有没有链接。它仅在函数内部可见。第一次调用该函数时会对其进行初始化(如果不调用该函数,则不会完全初始化)。因此,第一次调用f时它将在控制台中写入“ 3”。在第二次调用时,它将写为“ 4”,以此类推。读者应该先了解一下带有析构函数的对象的行为。

在类定义中,它是完全不同的。

class C {
public:
    void f();
    static void g();
    int i;
    static int j;
};

在这里,当您调用f时,必须必须在类型为C的对象上调用它,并且f可以使用该对象的数据成员,是,它可以查看并更改ij。调用g时,没有关联的对象。它仍然是C的成员,因此它可以查看并更改j,因为j也未与任何对象关联。只有一个j,并且所有C类型的对象都共享它。