3

我有一个工作代码库,其中有一个名为 Tabs 的类。这个类的所有方法和变量都被定义为静态的。我知道类的静态成员由该类对象的所有实例共享。此类用于将某种类型的数据存储为集合。许多不同的文件使用成员函数 Tabs::find() 和 Tabs::Insert() 却从未实例化类 Tabs 的对象。我试图了解它是如何工作的以及这种编程技术被称为什么。谢谢。

4

2 回答 2

4

static数据成员在main进入之前被初始化,这就是访问它们的原因。它们驻留在静态内存中,而不是动态或自动的。

只有静态成员的类类似于具有全局变量和函数,但组合在一起。它本身不是一种编程技术。这只是全局变量。

//globals.h
class Globals
{
   static int x;
public:
   static int getX() {return x;}
};

//globals.cpp
#include "Globals.h"
int Globals::x = 1;

//main.cpp
#include "Globals.h"
//x is initialized before call to main
int main()
{
    int x = Globals::getX();
}
于 2012-05-03T18:10:53.107 回答
2

我称之为“过时的”。它本质上是使用 a class(或struct,视情况而定)来模拟 a namespace

class whatever { 
    static int a, b, c;
    static double x, y, z;
};

int whatever::a, whatever::b, whatever::c;
double whatever::x, whatever::y, whatever::z;

与以下内容几乎相同:

namespace whatever {
    int a, b, c;
    double x, y, z;
}

您可能只是在处理namespace添加到该语言之前的代码。如果它不是那么旧,那么作者可能是,或者可能有一些意图保持对某些不支持namespace(正确)的编译器的可移植性。

In any case, what you have are global variables with qualified names. Even though they're inside a class/struct, the static means they have static lifetime, so being a struct affects only the name, not things like initialization or destruction.

于 2012-05-03T18:23:36.243 回答